线程控制
线程创建-pthread_create
线程分离-pthread_detach
线程取消-pthread_cancel
线程比较-pthread_equal
线程同步
场景
**
对于一个数据data
a 同一时间:a线程和b线程
b a
**
学习目标
**
互斥锁–pthread_mutext_t mutex
读写锁–pthread_rwlock_t lock
**
互斥锁
使用步骤
**
创建锁 pthread_mutext_t mutext;
使用锁 pthread_mutext_init(&mutext); |–mutext=1;
找资源
加锁
pthread_mutex_lock(&mutex); |–mutext=0;
临界区
解锁
pthread_mutex_unlock(&mutext); |–mutext=1;
**
相关函数
**
创锁:pthread_mutex_t mutex;
用锁:pthread_mutex_init(&mutex,NULL);
加锁:pthread_mutex_lock(&mutex);
试锁:pthread_mutex_trylock(&mutex);
解锁:pthread_mutex_unlock(&mutex);
毁锁:pthread_mutex_destroy(&mutex);
**
其它
原子操作
cup处理一个指令,线程/进程在处理完这个指令之前是不会失去cpu
临界区
死锁
读写锁
使用场景
**
1 创建锁
2 初始化锁 pthread_rwlock_init
3 加锁 pthread_rwlock_rdlock
4 尝试加读锁 pthread_rwlock_trydlock
5 解锁 pthread_rwlock_unlock
6 销毁锁 pthread_rwlock_destroy
**
**
互斥锁-读串行,写串行
读写锁-读并行,写串行
阻塞线程
不是什么时候都能阻塞线程
链表Node *head=NULL;
while(head==NULL)
{
//我们想让代码在这个位置阻塞
//等待链表中有了节点之后再继续向下运行
//使用条件变量
}
//链表不为空的处理代码
。。。。
。。。。
**
条件量–阻塞线程
**
创建:
pthread_cond_t cond;
操作:
关联:pthread_cond_init(&cond,NULL);
销毁:pthread_cond_destroy(cond);
阻塞等待下一个条件变量:pthread_cond_wait(&cond,&mutex);
阻时等待下一个条件变量:pthread_cond_timedwait();
唤醒部分的阻塞在条件变量上的线程:pthread_cond_signal();
唤醒全部的阻塞在条件变量上的线程:
**
**
**
信号量(信号灯)–高级的互斥锁
**
头文件 semaphore.h
信号量类型 sem_t sem;
共享资源
**