避免顺序线程中的混乱

时间:2016-08-05 07:21:13

标签: c++ multithreading boost

我需要按以下方式创建一个循环:

while (!end) {

     // some modifications to myPar

     boost::thread t(&myClass::myFun, this, myPar);

     // other operations
}

在每次迭代中,我希望线程仅在上一次迭代中调用的线程完成时启动。但我不想要"其他操作"等待它。 有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

我没有使用boost :: thread,但类似的东西应该可以使用

boost::thread t;
while (!end) {

     // some modifications to myPar
     if(t.joinable())
          t.join();

     t = {&myClass::myFun, this, myPar};

     // other operations
}

EDIT 关于评论你可以做这样的事情

class Worker
{

public:
    void addParams( const SomeParams &params)
    {
        paramsQueue.push(params);
    }

    void start()
    {
        auto loop = [this]()
        {
            while(!interrupted)
            {
                //BLOCK HERE if queue is empty

                auto params = paramsQueue.pop();

                //do something with params
            }
        };

        thread = {loop};
    }

    void interrupt()
    {
        interrupted = true;
    }

private:
    boost::thread thead;
    std::queue<SomeParams> paramsQueue;
    bool interrupted = false;
};


...

Worker worker;

worker.start();

while (!end) {

     // some modifications to myPar

     worker.addParams(params);

     // other operations
}

但请记住实施阻止,因为如果您尝试读取空队列,您将拥有UB。从队列中推送和弹出也必须是线程安全的。