C++ 具有多线程的Boost条件变量
在我的程序中,我有两个基本线程。第一个是主线程,第二个是Tcp服务器线程。TCP服务器将侦听请求,并为每个请求创建一个相应的线程,每个新创建的线程都应开始工作,直到它们到达某个点,在该点上它们必须等待来自主线程的指示。为了解决这个问题,我使用Boost 1.49实现了一个条件变量 我的主要问题是,每当任何新创建的线程到达条件变量的点时,我的整个程序都会冻结 有关更多信息,请检查: 直到现在我还没有收到任何积极的回应,我也无法解决这个问题C++ 具有多线程的Boost条件变量,c++,multithreading,boost,C++,Multithreading,Boost,在我的程序中,我有两个基本线程。第一个是主线程,第二个是Tcp服务器线程。TCP服务器将侦听请求,并为每个请求创建一个相应的线程,每个新创建的线程都应开始工作,直到它们到达某个点,在该点上它们必须等待来自主线程的指示。为了解决这个问题,我使用Boost 1.49实现了一个条件变量 我的主要问题是,每当任何新创建的线程到达条件变量的点时,我的整个程序都会冻结 有关更多信息,请检查: 直到现在我还没有收到任何积极的回应,我也无法解决这个问题 非常感谢。我还没有看你的其他问题(代码太多) 不过,一般
非常感谢。我还没有看你的其他问题(代码太多) 不过,一般来说,您必须在相应的互斥锁下等待/发出条件信号 下面是一个演示,使用一组10名工人等待启动信号:
- 查看它
#include <boost/thread.hpp> #include <boost/optional/optional_io.hpp> ///////////////////////// // start condition logic boost::mutex mx; boost::condition_variable cv; static bool ok_to_start = false; void await_start_condition() { boost::unique_lock<boost::mutex> lk(mx); cv.wait(lk, [] { return ok_to_start; }); } void signal_start_condition() { boost::lock_guard<boost::mutex> lk(mx); ok_to_start = true; cv.notify_all(); } ///////////////////////// // workers static boost::optional<int> shared_secret; void worker(int id) { await_start_condition(); // demo worker implementation static boost::mutex console_mx; boost::lock_guard<boost::mutex> lk(console_mx); std::cout << "worker " << id << ": secret is " << shared_secret << "\n"; } int main() { boost::thread_group threads; for (int i = 0; i<10; i++) threads.create_thread(boost::bind(worker, i)); // demo - initialize some state before thread start shared_secret = 42; // signal threads can start signal_start_condition(); // wait for all threads to finish threads.join_all(); }
namespace /* anon detail */ { bool ok_to_start_predicate() { return ok_to_start; } } void await_start_condition() { boost::unique_lock<boost::mutex> lk(mx); cv.wait(lk, ok_to_start_predicate); }
#include <boost/phoenix.hpp> void await_start_condition() { boost::unique_lock<boost::mutex> lk(mx); cv.wait(lk, boost::phoenix::cref(ok_to_start)); }
#包括 #包括 ///////////////////////// //启动条件逻辑 boost::互斥mx; boost::条件变量cv; 静态bool ok_to_start=false; 无效等待\启动\条件() { boost::unique_lock lk(mx); cv.wait(lk,[{返回ok_到_start;}); } 无效信号\启动\条件() { 增压:锁紧保护lk(mx); ok_to_start=真; cv.通知所有人(); } ///////////////////////// //工人 静态boost::可选的共享密钥; 无效工作程序(内部id) { 等待启动条件(); //演示工作者实现 静态boost::互斥控制台\u mx; boost::锁定保护lk(控制台mx);
std::非常感谢您的回复。但我完全按照boost的文档使用条件变量。在您的示例中,您让所有工作人员等待信号启动,但在我的情况下。每个请求都以与其他请求不同的方式处理。每个请求都有自己的互斥体和条件变量。也许您可以将其精简为SSCCE(也许使用我的示例作为起点?)你说的SSCCE和phoenix是什么意思?如果你想要一个关于我问题的较短代码,你可以检查一下。谢谢。你知道,我回答了这个问题。不是其他问题。我的意思是和。顺便说一句,代码就在那里,在我的答案中,在看了其他答案中的代码后,尝试移动
给你打电话在互斥锁下(请参阅我答案中的注释)。可能存在争用条件。此外,请使用谓词的notify_one
重载,正如我在本例中所示(否则,即使已经设置了条件,您也会等待。(没有足够的代码来查看是否实际会发生这种情况)wait()