C++ 互斥 - 检查另一个线程是否正在等待

C++ Mutexes- Check if another thread is waiting

本文关键字:是否 在等待 线程 另一个 互斥 检查 C++      更新时间:2023-10-16
已经

锁定互斥锁的线程是否可以在不释放互斥锁的情况下检查另一个线程是否已经在等待?例如,假设一个线程有 3 个任务要在数据块上运行,但另一个线程也可能有一个短任务要对数据运行。理想情况下,我会让第一个线程检查另一个线程是否在三个任务中的每一个之间等待,并允许另一个线程在恢复其他两个任务之前执行其任务。Boost 是否有支持此功能的互斥锁类型(假设 C++11 互斥锁或锁类型不支持此功能),或者可以使用条件变量来完成此操作?

您无法检查其他线程是否正在等待互斥锁。

如果你想给其他线程运行的机会,只需释放互斥锁。无需知道是否有人在等待。然后根据需要重新获取。

条件变量是事件。如果您想到某些事情发生,请使用它们。要检查是否发生了某些事情,您需要一个常规(互斥保护或原子)变量。

您无法检查其他线程是否正在等待互斥锁。

如果您确实需要此类功能,则需要实现自己的功能。具有use_count的互斥锁将满足您的需求。

class my_mutex{
public:
   my_mutex() {count=0;}
   void lock() {count++; mtx.lock();}
   void unlock() {count--; mtx.unlock();}
   size_t get_waiting_threads() {return count>1?count-1:0;}
private:
   atomic_ulong count;
   mutex mtx;
};

如果需要在执行任务 3 之前完成任务 1 和 2,则应使用 conditional_variable 而不是互斥锁。

如果两个线程正在等待锁定,则首先开始等待的线程不能保证是当它可用时首先获得它的线程。因此,如果你是一个做类似事情的紧环线程

while(true):
  mutex.lock()
  print "got the lock; releasing it"
  mutex.unlock()

您可能认为您对所有其他等待锁定的线程都很礼貌,但事实并非如此,系统可能会一遍又一遍地为您提供锁定,而不会让任何其他线程跳入,无论它们已经等待了多长时间。

条件变量是解决此问题的合理方法。