目录
一,线程函数
1、创建一个线程
2、获取自身线程ID
3、线程终止
4、取消正在执行线程
5、线程等待
6、线程分离
二,线程的使用
1,线程等待和线程分离
(1)、线程等待
(2)、线程分离
(3)、线程等待线程分离同时进行
三,互斥量接口
1、初始化互斥量
(1)、静态分配
(2)、动态分配
2、互斥量销毁
3、互斥量加锁
4、互斥量解锁
四,线程互斥
1、发现问题
2、加锁解决
一,线程函数
1、创建一个线程
需要注意用的时候要链接线程库 -lpthread才可以.
(1)、thread:线程id
(2)、attr:设置线程属性,一般不设置传nullpr。
(3)、start_rootine:函数指针,线程跑起来执行的方法。
(4)、arg:线程方法的参数,安规范随便传,又是会传this,有非常的巧妙。
2、获取自身线程ID
3、线程终止
(1)、retval:输出线参数,不要传临时变量,将来这个会带回线程退出的退出码。
(2)、线程是不关心信号的,线程出错了那就是进程的错,线程崩掉整个进程都会崩掉。只要出错就找进程这个老大,就是进程的错,问责进程。
4、取消正在执行线程
字面意思,传需要的线程id
5、线程等待
(1)、线程也是需要等待的,类比进程等待,不然会有资源无法释放。
(2)、thread:线程id
(3)、retval:一个指针,指向线程的返回值,为什么是二级指针,因为线程方法函数返回值是一个void*的指针,我们要得到一个指针,就要传指针的地址,也就是二级指针。
(4)、如果thread线程被别的线程调用pthread_ cancel异常终掉,value_ ptr所指向的单元里存放的是常数PTHREAD_ CANCELED(pthread_canceled)。
6、线程分离
(1)、不关心线程的返回值,我们就可以直接线程执行的时候设置线程分离,这样就不需要进行线程等待消耗时间了,线程再执行结束的时候自动释放自己的资源。
(2)、可以别人分离,也可以自己分离。
(3)、joinable和分离是冲突的,一个线程不能既是joinable又是分离的。
二,线程的使用
1,线程等待和线程分离
(1)、线程等待
(2)、线程分离
(3)、线程等待线程分离同时进行
不可以同时进行:线程分离的同时又线程等待,线程等待是会失败的,也就是说你以为资源没有回收,起始以及回收了。
等待失败,并且导致进程收到信号退出了。
三,互斥量接口
1、初始化互斥量
(1)、静态分配
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER
静态分配的使用完了之后不需要销毁
(2)、动态分配
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict
attr);
mutex:要初始化的互斥量
attr:NULL
2、互斥量销毁
int pthread_mutex_destroy(pthread_mutex_t *mutex);
3、互斥量加锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
互斥量处于未锁状态,该函数会将互斥量锁定,同时返回成功。
发起函数调用时,其他线程已经锁定互斥量,或者存在其他线程同时申请互斥量,但没有竞争到互斥量,那么pthread_ lock调用会陷入阻塞(执行流被挂起),等待互斥量解锁。
4、互斥量解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);
四,线程互斥
1、发现问题
多线程访问统一个临界资源是,如果对临界资源的访问修改不是原子性质的,那么可能出问题。
一个抢票的例子:五个线程同时抢票
结果是错的,票已经没有了,还抢到了0号票、这么多人抢到了0号票,那么这个作为该给谁啊,这不就扯蛋蛋了、、完犊子啊。
原因就是--操作,和if判断都不是原子操作的。再次执行结果也是不一样的,每次都可能不一样。
如何解决呢
2、加锁解决
对临界区进行加锁:
这下结果就正确了
所以以后再多线程情况下访问修改临界资源的时候一定要进行加锁保护临界资源。