如果其他人正在等待,是否有标准的 STL 或 Qt 方法来产生互斥量,否则保留它?

Is there a standard STL or Qt way to yield a mutex if someone else is waiting, otherwise keep it?

在我的工作线程中,最方便的外循环逻辑是

lock (mutex_foo);

while (not done)
{
    do_some_work ();

    if (someone_is_waiting_for (mutex_foo))
    {
        unlock (mutex_foo);

        wait_until_someone_else_locks (mutex_foo);

        // expect this lock to already be taken,
        // this thread will now wait its turn
        lock (mutex_foo);
    }
}

unlock (mutex_foo);

主线程会

while (not_done)
{
    do_stuff ();

    lock (mutex_foo); // this will interrupt the worker thread's main loop

    use_shared_resource ();

    unlock (mutex_foo);
}

我使用 C++11 和 Qt 5。我应该如何实现它?

super 关于使用 std::atomic_int<> 的建议可能会奏效,但我认为您在这里可能想得太多了——一个更简单且 easier-to-verify 的工作线程方法是这样的:

while(not done)
{
   lock_mutex();
   do_some_work();
   unlock_mutex();
}

这将允许其他线程在当前对 do_some_work() 的调用返回后立即获得互斥体的所有权。

如果您担心这会引入额外的互斥锁锁定和解锁,请不要担心 - 这些天互斥锁很漂亮 well-optimized,而且它们的 lock_mutex() 不太可能和 unlock_mutex() 操作比您的 check_if_someone_is_waiting() 功能更昂贵。