是否可能已经锁定互斥锁的线程检查另一个线程是否已经在等待,而不释放互斥锁?例如,假设一个线程有3个任务要在一个数据块上运行,但另一个线程也可能有一个短任务来运行数据。理想情况下,我有第一个线程检查另一个线程是否在三个任务中的每一个之间等待,并允许另一个线程在恢复其他两个任务之前执行其任务。 Boost是否有一种支持此功能的互斥锁(假设C ++ 11互斥锁或锁类型不支持此功能),还是可以使用条件变量来完成?
答案 0 :(得分:2)
您无法检查其他线程是否在等待互斥锁。
如果你想让其他线程有机会运行,只需释放互斥锁即可。不需要知道是否有人在等。然后根据需要重新获得。
条件变量是事件。如果您想等待,请使用它们直到发生某些事情。要检查是否发生了某些事情,您需要一个常规(互斥保护或原子)变量。
答案 1 :(得分:1)
您无法检查其他线程是否在等待互斥锁。
如果您确实需要此类功能,则需要实现自己的功能。 使用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而不是mutex。
答案 2 :(得分:0)
如果两个线程正在等待一个锁,那么首先开始等待的线程 not 保证是在它可用时首先得到它的线程。所以,如果你是一个紧密循环的线程,他做了像
这样的事情while(true):
mutex.lock()
print "got the lock; releasing it"
mutex.unlock()
你可能认为你对等待锁定的所有其他线程都很有礼貌,但你不是,系统可能只是一次又一次地给你锁定而不让任何其他线程无论他们等待多久,他们都会跳进去。
条件变量是解决此问题的合理方法。