ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 了解std :: condition_variables

2019-08-29 20:06:53  阅读:177  来源: 互联网

标签:c c11 condition-variable


当我有多个线程等待执行时,我正在尝试理解condition_variable的流程.根据我的理解,所有线程都会尝试获取唯一的锁,一个会得到它然后进入wait(),如果你调用notify_all,最多不会有一个线程等待允许通过.直到它释放它的锁并允许其他线程通过.

cv是否与唯一锁通信并让所有线程同时通过所有线程?如果是这样的话,它确实是一次性的,或者线程是否依次顺序通过.

std::condition_variable cv;
std::mutex cv_m; // This mutex is used for three purposes:
                 // 1) to synchronize accesses to i
                 // 2) to synchronize accesses to std::cerr
                 // 3) for the condition variable cv
int i = 0;

void waits()
{
    std::unique_lock<std::mutex> lk(cv_m);
    std::cerr << "Waiting... \n";
    cv.wait(lk, []{return i == 1;});
    std::cerr << "...finished waiting. i == 1\n";
}

http://en.cppreference.com/w/cpp/thread/condition_variable/notify_all

解决方法:

当您调用wait(单参数版本)时,锁定被解锁并且线程进入等待状态,直到CV被“通知”.当一个线程被唤醒时,锁被再次锁定.

当您拨打notify_one时,基本上会在CV上等待随机线程.当您调用notify_all时,等待CV的所有线程将从等待状态唤醒,锁定锁定的第一个线程将继续.这将是随机的.

请注意,当我说“随机”时,系统上的线程(从C库到操作系统内核甚至硬件)的实际实现可能会以某种方式实现,以便可以推断出哪个线程将是醒来并获得锁定的那个,但从使用条件变量的应用程序编写者的角度来看,没有预定的顺序,它是随机的.

标签:c,c11,condition-variable
来源: https://codeday.me/bug/20190829/1763063.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有