Linux条件变量
创始人
2024-03-24 02:57:08
0

一、条件变量函数

1,条件变量

条件变量:用来描述某种临界资源是否就绪的一种数据化描述。通常要配合mutex一起使用。

2,初始化

pthread_connd_init:

同样有一个静态的和一个动态的。 

其中cond是需要初始化的条件变量,attr传nullptr。

3,销毁

pthread_cond_destroy;

 cond:要销毁的条件变量。


4,等待

有俩个,一般只用第二个pthread_cond_wait:

在指定条件变量下等待。

      这里需要传一个锁,这个起始很好理解,因为你等待一定是带着锁的,因为你首先抢到了锁了,准备执行你的任务,发现条件不满足,这时候你需要在自己的条件变量上等待,但是这个时候你自己是带着锁的,也就是说你在等待的时候别人不会再申请到锁了,所以你在等待的时候这个函数会自动释放你获得的锁,再你被唤醒时再去竞争锁。

        条件等待是线程间同步的一种手段,如果只有一个线程,条件不满足,一直等下去都不会满足,所以必须要有一个线程通过某些操作,改变共享变量,使原先不满足的条件变得满足,并且友好的通知等待在条件变量上的线程。
        条件不会无缘无故的突然变得满足了,必然会牵扯到共享数据的变化。所以一定要用互斥锁来保护。没有互斥锁就无法安全的获取和修改共享数据

5,唤醒

第一个是唤醒指定条件变量上面等待的一个进程, 

第二个是唤醒指定条件变量上面等待的所有进程,

6,代码练习

#include 
#include 
#include 
#include 
#include using namespace std;//创建一把静态的锁。
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
//创建一个条件变量
pthread_cond_t cond;//相等于定义一个函数指针数组。
vector> functors;
void *handler1()
{cout << "handler1" << endl;
}
void *handler2()
{cout << "handler2" << endl;
}volatile bool quit = false;void *waitcommend(void *args)
{//线程分离。不需要等待了。pthread_detach(pthread_self());while (!quit){//pthread_mutex_lock(&mutex);//不满足条件再这个条件变量上等待。pthread_cond_wait(&cond, &mutex);//被唤醒之后执行任务。pthread_mutex_unlock(&mutex);for (auto &e : functors){e();}}cout << "thread " << pthread_self() << "退出了" << endl;return nullptr;
}
int main()
{functors.push_back(handler1);functors.push_back(handler2);functors.push_back([]() -> void *{ cout << "我是landan" << endl; });//初始化条件变量pthread_cond_init(&cond, nullptr);pthread_t t1;pthread_t t2;pthread_t t3;pthread_create(&t1, nullptr, waitcommend, nullptr);pthread_create(&t2, nullptr, waitcommend, nullptr);pthread_create(&t3, nullptr, waitcommend, nullptr);sleep(3);
cout<<"设置退出标记位,唤醒全部线程"<

       开始条件不满足,全部再cond条件变量上面等待,然后设计标记位quit位true模拟条件满足,唤醒所有线程,执行代码后条件木满足不在等待线程不在等待,直接执行后续代码退出。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...