目录
Linux线程同步
条件变量
什么是条件变量:
条件变量是利用线程间共享的全局变量进行同步的一种机制。主要包括两种动作:
- 线程等待条件变量的成立而挂起
- 另一个线程使条件变量成立而通知其它线程。
这个怎么理解呢?举个例子:当你去超市买手机,问售货员有没有苹果13,售货员需要在苹果13到的时候才知道有没有苹果13,那么你需要等待售货员的通知,这个时候你是被挂起的,在wait售货员;同时当苹果13到店里的时候,售货员知道了有苹果13,条件成立了,售货员通知你苹果13到了,这个时候就是发信号signal的时候。
一般条件变量需要与互斥锁同时使用,那么互斥锁的用处在下面的例子有讲到。
条件变量的作用:
使用条件变量可以以原子方式阻塞线程,直到某个特定条件为真为止,条件变量一般是与互斥锁一起使用的,对条件变量的测试一般是在互斥锁的保护下进行的。
条件变量的用法:
初始化:
条件变量的初始化和创建进程初始化一摸一样,只是换了个名字,条件变量初始化也包括动态初始化和静态初始化
动态初始化:
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr); 参数:
cond:要初始化的条件变量
attr:NULL--设置条件变量属性,一般设置为NULL即可
返回值:
成功返回0,失败返回错误码
静态初始化:
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
销毁:
int pthread_cond_destroy(pthread_cond_t *cond)
等待条件满足:
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
参数:
cond:要在这个条件变量上等待
mutex:互斥量,后面详细解释
唤醒等待:
int pthread_cond_broadcast(pthread_cond_t *cond); //唤醒所有进程
int pthread_cond_signal(pthread_cond_t *cond); //唤醒一个进程
条件变量简单案例:
思路:
创建一个master线程和3个worker线程,master线程用来发送信号signal,worker的每个线程接收到master线程信号开始做自己的动作。
主函数中的主线程工作:初始化(线程,条件变量),创建线程,等待线程,销毁。
两个新线程的动作:master状态就绪发送信号,唤醒等待队列中的线程,worker线程阻塞等待接收信号,再做动作。我们使用了pthread_cond_signal唤醒队列中的线程,那么唤醒的是哪一个呢?唤醒的是队列中第一个线程。
#include <iostream>
#include <string>
#include <pthread.h>
#include <unistd.h>
using namespace std;
pthread_mutex_t mtx;//互斥锁
pthread_cond_t cond;//条件变量
void* ctrl(void* args)
{
std::string name=(char*)args;
while(true)
{
std::cout<<"master say: