Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11标准::周期中的线程_C++_Multithreading_C++11 - Fatal编程技术网

C++ C++;11标准::周期中的线程

C++ C++;11标准::周期中的线程,c++,multithreading,c++11,C++,Multithreading,C++11,我在C++11中有这样一个循环: while (true) { std::thread t0(some_work, 0); ... std::thread tn(some_work, n); t0.join(); ... tn.join(); } 但是在每次迭代中创建新线程当然不是件好事。在C语言中,很容易使用消息告诉线程等待另一次迭代,但我想用C++11工具来完成。我查看了条件变量,但我认为这不是解决方案。我能用它做些什么?使用Boost获得

我在C++11中有这样一个循环:

while (true) 
{
    std::thread t0(some_work, 0);
    ...
    std::thread tn(some_work, n);
    t0.join();
    ...
    tn.join();
}
但是在每次迭代中创建新线程当然不是件好事。在C语言中,很容易使用消息告诉线程等待另一次迭代,但我想用C++11工具来完成。我查看了条件变量,但我认为这不是解决方案。我能用它做些什么?

使用Boost获得通过! 注意:我没有C++11,因此我将向您展示的代码是针对C++98的。大多数Boost内容最终出现在标准的
std::tr1
和后续版本中,因此大部分内容可能在没有Boost的情况下是可以传输的

听起来你有多个线程在不断地分配工作,但不是始终如一地分配。工作并不总是需要执行(否则线程可以在自己的循环中执行),或者线程可能没有执行它的信息。如果是这样的话,考虑一下。< /P> 这样,您将需要创建一个始终运行的线程,因此您可能希望将线程放入类中(尽管不需要)


您可以继续分配所需的工作量。一旦
WorkerThread
s超出作用域,它们将停止运行并很好地关闭

Hmm我有一个问题,因为我想在所有线程完成工作后调用一些func(比如apply_changes();),所以我可能需要类似smth的消息
class WorkerThread
{
    WorkerThread()
    : thread(&WorkerThread::HandleWorkThread, this), io_service(), runThread(true)
    {
    }
    ~WorkerThread()
    {
        // Inform the thread not to run anymore:
        runThread = false;
        // Wait for the thread to finish:
        thread.join();
    }
    void AssignWork(boost::function<void()> workFunc) { io_service.post(workFunc); }
private:
    void HandleWorkThread()
    {
        while (runThread)
        {
            // handle work:
            io_service.run();
            // prepare for more work:
            io_service.reset();
        }
    }

    boost::thread thread;
    boost::asio::io_service io_service;
    bool runThread; // NB: this should be atomic
};
void CalculateThings(int, int);
void CalculateThingsComplex(int, int, double);

// Create two threads. The threads will continue to run and wait for work to do
WorkerThread thread1, thread2;
while (true)
{
    thread1.AssignWork(boost::bind(&CalculateThings, 20, 30));
    thread2.AssignWork(boost::bind(&CalculateThingsComplex, 2, 5, 3.14));
}