30.Linux/Unix 系统编程手册(上) -- 线程:线程同步
1.互斥量
互斥量可以帮助线程同步对共享资源的使用。
确保同时只有一个线程可以访问某项共享资源,一旦线程锁定互斥量,随即称为该互斥量的所有者。只有所有者才能给互斥量解锁。
pthread_mutex_lock();
pthread_mutex_unlock();
pthread_mutex_trylock();
pthread_mutex_timedlock();
如果使用 fcntl()进行加锁,解锁一片文件区域,总是要发起系统调用。与之相反,互斥量的实现采用了机器语言的原子操作,
只有发送锁争用时才执行系统调用。
死锁:
有时,一个线程需要同时访问2个或者更多不同的共享资源,而每个资源又都由不同的互斥量管理。当超过一个线程加锁同一组互斥量时,
就有可能发送死锁。
解决方法:
以相同的顺序加锁。
1.互斥量的静态初始化
static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; // 互斥量静态初始化,使用情况:经由静态分配且携带默认属性。
2.互斥量的动态初始化
pthread_mutex_init();
下面情况必须使用动态初始化:
1.动态分配于堆中的互斥量
2.互斥量是在栈中分配的自动变量
3.初始化经由静态分配,且不使用默认属性的互斥量
互斥量的销毁:
pthread_mutex_destroy();
静态分配的不用调用 pthread_mutex_destroy()。
pthread_mutexattr_settype();
2.条件变量
条件变量则允许线程互相通知共享变量的状态发送了变化。
条件变量允许一个线程就某个共享变量的状态变化通知其他线程,并让其他线程等待(阻塞)这一通知。
条件变量允许一个线程休眠,直至接获另外一个线程的通知去执行某些操作。
条件变量总是结合互斥量使用,条件变量就是共享变量的状态改变发出通知,而互斥量则是提供对共享变量访问的互斥。
由静态分配的条件变量:
pthread_cond_t cond = PTHREAD_COND_INITIALIER;
pthread_cond_signal();
pthread_cond_broadcase();
pthread_cond_wait();
pthread_cond_signal 与 pthread_cond_broadcase 的区别在于,二者对阻塞与 pthread_cond_wait的多个线程的处理方式
不同,pthread_cond_signal 函数只保证唤醒至少一条遭遇阻塞的线程,pthread_cond_broadcase 则会唤醒所有阻塞的线程。
pthread_cond_timedwait();