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

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,因为这只不过是轮询标志。不是吗

最佳答案

是。每当调用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()),线程将处理数据,然后再次等待。

关于c++ - 重置条件变量(提升),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37536250/

10-11 21:02