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

标签 c++ multithreading c++11 stl mutex

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

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<> 的建议可能会奏效,但我认为您在这里可能想得太多了——一种更简单、更易于验证的工作线程方法是这样的:

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

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

如果您担心这会引入额外的互斥锁锁定和解锁,请不要担心——互斥锁现在已经得到了很好的优化,它们的 lock_mutex() 和 unlock_mutex() 操作不太可能再出现了比你的 check_if_someone_is_waiting() 功能要贵。

关于c++ - 如果其他人正在等待,是否有标准的 STL 或 Qt 方法来产生互斥量,否则保留它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48814370/

相关文章:

c++ - 如何在不破坏现有代码的情况下向函数添加输出参数?

c++ - 创建可暂停/可恢复线程的最佳方法是什么

c - 使用 SIMD 和 openMP 加速矩阵乘法

java - Thread.sleep() 方法如何工作?

recursion - 递归 lambda 的开销

c++ - 前向 boost::从访问者到另一个访问者的变体

c++ - 在编译时触发 void constexpr?

c++ - 使用 typeid 运算符的最佳替代方案

c++ - 如何确保 initializer_list 不为零

c++ - 继承的构造函数,在 clang++3.9 中编译,在 g++7 中失败