C++ 具有多线程的Boost条件变量

C++ 具有多线程的Boost条件变量,c++,multithreading,boost,C++,Multithreading,Boost,在我的程序中,我有两个基本线程。第一个是主线程,第二个是Tcp服务器线程。TCP服务器将侦听请求,并为每个请求创建一个相应的线程,每个新创建的线程都应开始工作,直到它们到达某个点,在该点上它们必须等待来自主线程的指示。为了解决这个问题,我使用Boost 1.49实现了一个条件变量 我的主要问题是,每当任何新创建的线程到达条件变量的点时,我的整个程序都会冻结 有关更多信息,请检查: 直到现在我还没有收到任何积极的回应,我也无法解决这个问题 非常感谢。我还没有看你的其他问题(代码太多) 不过,一般

在我的程序中,我有两个基本线程。第一个是主线程,第二个是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()
    重载,正如我在本例中所示(否则,即使已经设置了条件,您也会等待。(没有足够的代码来查看是否实际会发生这种情况)