线程
多线程线程并发问题
死锁
4个必要条件以及解决方案
- 互斥:一般不会破坏互斥条件。
- 请求保持:将申请所有共享资源当成一个原子操作。
- 不可剥夺:当线程申请不到共享资源时,释放自己持有所有共享资源。
- 循环等待:可以顺序申请资源来解决。
条件变量:需要用互斥锁一起使用
//1.初始化
pthread_cond_init();
pthread_cond_t cond = PTHREAD_COND_IN;
//2.等待条件成立的步骤
pthread_cond_timedwait();
pthread_cond_wait();
//3.唤醒阻塞线程
pthread_cond_signal(pthread_cond_t *cond);//至少唤醒一个
pthread_cond_broadcast(pthread_cond_t *cond);//唤醒所有等待该条件变量的线程
//4.销毁
pthread_cond_destory();
- pthread_cond_wait()执行流程
- 释放互斥锁,然后阻塞线程
- 当函数返回时,一定要再次获得锁。但是条件变量不一定成立。这是由于唤醒线程两个API,signal和bradncast。