Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++_Multithreading_Stl_C++11 - Fatal编程技术网

C++ 我怎么能等多件事

C++ 我怎么能等多件事,c++,multithreading,stl,c++11,C++,Multithreading,Stl,C++11,我正在使用C++11和stl线程编写一个线程安全队列。WaitAndPop方法当前如下所示。我希望能够向WaitAndPop传递一些指示调用线程是否已被要求停止的内容。WaitAndPop如果等待并返回队列的元素,则应返回true;如果调用线程正在停止,则应返回false bool WaitAndPop(T& value, std::condition_variable callingThreadStopRequested) { std::unique_l

我正在使用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;
    }
bool WaitAndPop(T&value,std::condition_变量callinghtreadstopRequested)
{
std::唯一锁(互斥锁);
while(queuedTasks.empty())
{
QueuedTaskCondition.wait(锁定);
}
value=queue.front();
queue.pop_front();
返回true;
}
有可能编写这样的代码吗?我习惯使用Win32 WaitForMultipleObjects,但找不到适用于这种情况的替代方案

谢谢


我见过这个相关的问题,但它并没有真正回答问题

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

 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;
}
bool WaitAndPop(T&value)
{
std::唯一锁lk(互斥锁);
//等待队列不为空或发出停止信号
等待条件(lk,[&]()
{
return(stop | |!(myQueue.empty());
});
//停止信号发出,让我们返回false
if(stop){return false;}
//一个项目被推入队列,让我们弹出它并返回true
value=myQueue.front();
myQueue.pop_front();
返回true;
}
这里,
stop
是一个全局变量,类似于
condition
myQueue
(我建议不要将
queue
用作变量名,因为它也是标准容器适配器的名称)。控制线程可以将
stop
设置为
true
(同时锁定
mutex
),并在
条件下调用
notifyOne()
notifyAll()


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

我对POSIX
WaitForMultipleEvents
的解决方案是使用
poll()
并使用事件管道。我不认为这会对你的条件变量有所帮助,但是…我想说这是Antony Williams在“使用条件变量实现线程安全队列”中描述的推荐方法。嗯,是的,我明白了。它是一个线程安全的队列,但也不提供在需要停止线程时放弃等待的功能(好吧,没有任何好的线程程序都希望避免的旋转)。可能我可以在关闭场景中将一些特殊值推送到队列上,告诉WaitAndPop在弹出该值时返回false。我可能也能让它跳到队列的最前面,以便更快地终止。我认为你必须对cond变量进行共同化,使其符合你希望线程等待的所有事情。这是最简单的方法。否则,您可以恢复使用FS对象并使用SELECT/POLL,但这是POSIX,而不是纯C++,所以…我认为C++中没有等价的<代码> WaistFrimeType对象<代码>。让我们看看OP是否会满意:)@AndyProwl我会和他核实一下