当前位置: 首页 > 知识库问答 >
问题:

我怎么能等多件事呢

武博艺
2023-03-14

我正在使用C 11和stl线程编写线程安全队列。WaitAndPop方法目前如下所示。我希望能够向WaitAndPop传递一些指示调用线程是否已被要求停止的东西。WaitAndPop如果等待并返回队列的一个元素,则应返回true,如果调用线程被停止,则应返回false。

    bool WaitAndPop(T& value, std::condition_variable callingThreadStopRequested)
    {
        std::unique_lock<std::mutex> lock(mutex);
        while( queuedTasks.empty() )
        {
            queuedTasksCondition.wait(lock);
        }

        value = queue.front();
        queue.pop_front();
        return true;
    }

有可能编写这样的代码吗?我习惯了Win32 WaitForMultipleObject,但找不到适用于这种情况的替代方案。

谢谢

我见过这个相关的问题,但它并没有真正回答问题。linux上的学习线程

共有1个答案

孟昊空
2023-03-14

如果我正确理解你的问题,我可能会这样做:

 bool WaitAndPop(T& value)
 {
    std::unique_lock<std::mutex> lk(mutex);            

    // Wait until the queue won't be empty OR stop is signaled
    condition.wait(lk, [&] ()
    {
        return (stop || !(myQueue.empty()));
    });

    // Stop was signaled, let's return false
    if (stop) { return false; }

    // An item was pushed into the queue, let's pop it and return true
    value = myQueue.front();
    myQueue.pop_front();

    return true;
}

在这里,Stop是一个全局变量,类似于条件myQueue(我建议不要使用队列作为变量名,因为它也是标准容器适配器的名称)。控制线程可以将Stop设置为true(同时持有对互斥锁的锁)并在条件上调用通知一个()通知所有()

这样,当一个新项目被推入队列时,以及当发出停止信号时,都会调用条件变量上的notify***(),这意味着在等待该条件变量后醒来的线程必须检查它被唤醒的原因,并相应地采取行动。

 类似资料: