重置条件变量(boost)

时间:2016-05-31 03:10:10

标签: c++ synchronization boost-thread

如果已经提出这个问题,我道歉 是否可以清除已设置的条件变量?
我想在下面实现的细节:

void worker_thread {
    while (wait_for_conditional_variable_execute) {
        // process data here
        // Inform main thread that the data got processed
        // Clear the conditional variable 'execute'
    }
}

注意工作线程应该只处理一次数据,它应该等待主线程再次设置“执行”条件变量

我还考虑过如下标志

void worker_thread {
    while (wait_for_conditional_variable_execute) {
        if (flag) { flag = 0; }
        // process data here. The `flag` will be set by main thread
        }
}

但我认为这将是CPU密集型的,因为这只是对旗帜的轮询。不是吗?

1 个答案:

答案 0 :(得分:1)

是。每次调用condition_variable时都会重置wait()wait()阻止当前线程,直到condition_variable 被唤醒可以这么说。

但您似乎错误地使用了condition_variable。而不是说

while (wait_for_conditional_variable_execute)

你真的想说

while (thread_should_run)
{
    // wait_for_conditional_variable_execute
    cv.wait();
}

这会给你带来以下效果:

void processDataThread()
{
    while (processData)
    {
        // Wait to be given data to process
        cv.wait();
        // Finished waiting, so retrieve data to process
        int n = getData();
        // Process data:
        total += n;
    }
}

然后在你的主线程中你有:

addData(16);
cv.notify_all();

您的线程将处理数据,重新进入while循环,然后等待condition_variable被触发。一旦被触发(即调用notify()),线程将处理数据,然后再次等待。