condition_variable_any 如此的不靠谱

TheNewIpad TheNewIpad 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
在工程中使用了condition_variable_any::timed_wait, 由于当时对此完全不了解。出现了BUG。


如下代码,请猜测, 输出的nRecv的值。
请注意,我先启动的testcallback_consumer。

#include <boost/thread.hpp>
#include <iostream>
#include <stdlib.h>
using namespace std;

boost::recursive_mutex g_mtx;
boost::condition_variable_any g_cnd;
bool g_bCOntinue = true;

void testcallback_product()
{
//模拟生产者1000次
for (int i = 0; i < 1000; i++)
{
//boost::this_thread::sleep(boost::posix_time::milliseconds(1));

boost::unique_lock<boost::recursive_mutex> lock (g_mtx);
g_cnd.notify_one();
}

g_bCOntinue = false;
}

// 首先启动该函数
void testcallback_consumer()
{
int nRec = 0;
bool bRet = false;

while( g_bCOntinue )
{
bRet = false;

boost::unique_lock<boost::recursive_mutex> lock (g_mtx);
while(!bRet)
{
bRet = g_cnd.timed_wait(lock, boost::posix_time::milliseconds(50));
if (bRet)
{
nRec++;
}
}
}

cout<<"nRecv == "<<nRec<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
boost::thread hC(&testcallback_consumer);

boost::this_thread::sleep(boost::posix_time::milliseconds(10));
boost::thread hP(&testcallback_product);

hP.join();
hC.join();

system("pause");
return 0;
}
...全文

相关推荐

condition_variable源码以及详细分析.docx

详细介绍了线程同步条件变量condition_variable的使用和它的源码,涉及到unique_lock, mutex, lock_guard, 虚假唤醒和惊群效应。

yuyi20112011

C++11 并发指南五(stdcondition_variable 详解).docx

C++11 并发指南五(stdcondition_variable 详解).docx

xnxy1829

C++11中的mutex, lock, condition variable实现分析

C++11中的各种mutex, lock对象,实际上都是对posix的mutex,condition的封装。不过里面也有很多细节值得学习。   std::mutex   先来看下std::mutex:   包增了一个pthread_mutex_t __m_,很简单,每个函数该干嘛干嘛。 C++ class mutex { pthread_mutex_t __m_; public: mutex() _NOEXCEPT {__m_ = (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;} ~mutex();

weixin_38651365

C++11多线程条件变量详解[项目代码]

本文详细介绍了C++11标准中<condition_variable>头文件中的条件变量类std::condition_variable及其相关函数。文章首先概述了条件变量的基本概念,包括其构造函数、wait()、wait_for()、wait_until()等成员函数的使用方法,并通过示例代码展示了如何在实际编程中应用这些功能。此外,文章还介绍了std::condition_variable_any、std::cv_status枚举类型以及std::notify_all_at_thread_exit()辅助函数的使用场景和注意事项。通过本文,读者可以全面了解C++11多线程编程中条件变量的核心功能及其实现细节。

Tomato

Java多线程中ReentrantLock与Condition详解

主要介绍了Java多线程中ReentrantLock与Condition详解,需要的朋友可以参考下

weixin_38502290
评论 3
收藏 已收藏
分享
返回顶部
TheNewIpad
模式及实现 5,529 成员 4,167 内容