使用两个线程来交替打印0-100 的数字,因为num需要做num++运算,num是临界资源,因此需要一个mutex互斥量来达到对num变量的互斥访问。
使用 std::condition_variable 信号量来达到两个线程同步,交替的打印0-100的数字。
其中 std::condition_variable 信号量 的wait( condition_variable &) 函数会将程序阻塞在此处,然后释放传入的 互斥量,让其他线程能够访问到临界资源,然后等待其他线程中对该 condition_variavle 变量使用 notify 操作之后 ,会对传入的互斥量再次进行上锁,然后 恢复运行。
1、对于 condition_variable 使用 wait 操作通常是在 当前线程中,对于临街资源的访问结束之后,来唤醒其他线程的来访问临界资源,以达到多个线程 的同步运行。
2、notify的使用,可以是在 使用wait阻塞当前线程之前 使用notity 来唤醒另一个线程,达到两个线程的交替运行 。 也可以在一个函数中进行notify,其他函数中 来进行 wait,类似于一对多的生产者消费者模型
用于记录自己的学习过程,如果不正确的地方,还请斧正
int num = 1;
std::mutex mtx;
std::condition_variable cond;
void fun() {
while(num<=100) {
std::unique_lock<std::mutex> lock(mtx);//互斥锁,管理临界资源num
std::cout << num++ << std::endl;
//进去wait的时候释放lock锁 , 出来lock的时候 加锁lock
cond.notify_one();//自己完成 之后唤醒其他的wait线程
cond.wait(lock);//释放锁lock,允许其他线程访问临街资源lock,自己阻塞,等待其他线程notify
lock.unlock();
}
std::cout << "end" << std::endl;
//先运行的线程到这里之后,由于另一个线程迟迟收不到notify,因此还被阻塞在最后一次for循环中
cond.notify_one();
}
int main() {
std::thread a(fun);
std::thread b(fun);
if (a.joinable()) a.join();
if (b.joinable()) b.join();
return 0;
}