2014-01-16 35 views
0

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

+0

这样的功能通常不会提供,因为它旁边没有用例,任何这样的信息已经被返回的信息过期了。 –

回答

2

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

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

有条件的变量是事件。如果您想要等待,请使用它们,直到出现问题。至检查无论发生什么事情,您都需要一个常规(互斥锁保护或原子)变量。

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。

+0

为什么使用'return count> 1?count-1:0;'而不仅仅是'return count'? –

+0

2William Rosenbloom 因为一个线程当前持有互斥体并做了一些工作,而不是等待互斥体。 – 4LegsDrivenCat

+0

2naive_coach 首先解锁互斥锁然后减少计数会更安全一些,但即使在这种情况下,读者应该明白,应该谨慎使用此示例my_mutex,因为计数值可能会在您检查它的点和你采取一些行动的重点。所以它只能用在这个事实并不重要的情况下。 – 4LegsDrivenCat

0

如果两个线程正在等待一个锁,开始等待的线程首先是而不是保证是在线程变得可用时首先获取它的线程。所以,如果你是一个紧密循环线程谁做类似

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

你可能会认为你是礼貌的所有其他线程等待锁,但你不是,系统可能只给你一遍又一遍的锁,不管其他线程是否跳入其中,无论他们等待多久。

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

相关问题