美文网首页
C++使用条件变量的一个案例

C++使用条件变量的一个案例

作者: crazyhank | 来源:发表于2022-02-18 22:26 被阅读0次

考察以下代码:

#include <iostream>
#include <condition_variable>
#include <thread>

std::mutex mutex_;
std::condition_variable condVar;
bool dataReady{false};

void WaitingForWork()
{
    std::cout << "Waiting" << std::endl;
    std::unique_lock<std::mutex> lk(mutex_);
    condVar.wait(lk, []{return dataReady;});
    std::cout << "Running" << std::endl;
}

void SetDataReady()
{
    {
        std::unique_lock<std::mutex> lk(mutex_);
        dataReady = true;
    }
    std::cout << "Data prepared" << std::endl;
    condVar.notify_one();
}
int main()
{
    std::thread t1(WaitingForWork);
    std::thread t2(SetDataReady);

    t1.join();
    t2.join();

    return 0;
}

输出的打印出现以下情况:

hank@hank-ThinkPad-T450s:~/cpp$ ./test_cv
Waiting
Running
Data prepared

按照一般的理解,等待线程t1中的“Running”打印应该在t2线程执行完notify_one函数之后才能执行,即t2线程的“Data prepared”应该是在"Running"之前打印。

解释:
虽然代码中t1要比t2先创建,但是由于操作系统调度的原因,有可能t2线程执行到22行的时候,t1线程才开始执行到13行,此时mutex锁和dataReady变量都是满足条件的,即条件变量的wait函数立刻返回,所以就出现了"Running"打印先于“Data prepared”打印,后面的notify_one函数其实也没啥作用了(但是不能不写,因为有可能t1线程真的在13行阻塞住了,只有靠t2线程执行notify_one函数解救它了)。

可以在28行和29行之间加入一个睡眠10ms语句,就会发现每次“Running”打印都是出现在"Data prepared"打印之后了。

相关文章

  • C++使用条件变量的一个案例

    考察以下代码: 输出的打印出现以下情况: hank@hank-ThinkPad-T450s:~/cpp$ ./te...

  • 同步并发操作

    本文主要说明条件变量的一些知识。 I、等待一个时间或其他条件 使用C++标准库提供的工具去等待事件的发生。通过另一...

  • DAX连接表系列(四) ⅤAR変量(2)

    (一) VAR案例 继续第一部分 (依据官方资料简体笔记) 使用变量优化 IF 条件 一个非常常...

  • c++变量的引用

    本文简单介绍c++变量的引用,在c++当中“引用”就是变量的别名,相当于给变量再起一个名字。 使用&符号来为a和b...

  • Objective-C的Block实质与实现探究 part-6

    Block使用__block�变量,且该变量为对象的情况 转换为C++: 虽然与截获对象时和使用__block变量...

  • C++ 中的变量

    C++ 中的变量内存数据类型 C++ 数据类型 使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的...

  • Linux系统编程—条件变量

    条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥...

  • C++如何优雅的打印出变量类型

    方法1:使用C++库自带的typeid函数 一般使用C++库中的typeid函数获取一个变量的类型,不过打印出来的...

  • 线程

    简单线程 带参线程 最大线程数 mutex c++版本 纯c++版本 纯c版本 条件变量(condition) 信...

  • Components

    Components不能单独存在。 C++使用Property Specifiers声明Component变量。 ...

网友评论

      本文标题:C++使用条件变量的一个案例

      本文链接:https://www.haomeiwen.com/subject/yjqulrtx.html