是否有可能已经有一个互斥锁的线程检查另一个线程是否已经在等待,而不释放互斥锁?例如,假设一个线程有3个任务在一个数据块上运行,但另一个线程也可能有一个短的任务来运行数据。理想情况下,我有第一个线程检查另一个线程是否在三个任务中的每一个之间等待,并允许另一个线程在恢复其他两个任务之前执行其任务。 Boost是否有一种支持此功能的互斥锁(假设C++ 11互斥锁或锁定类型不支持此功能),还是可以通过条件变量完成?C++互斥锁 - 检查另一个线程是否正在等待
回答
您无法检查其他线程是否正在等待互斥锁。
如果您想让其他线程有机会运行,只需释放互斥锁即可。无需知道是否有人在等待。然后根据需要重新获得。
有条件的变量是事件。如果您想要等待,请使用它们,直到出现问题。至检查无论发生什么事情,您都需要一个常规(互斥锁保护或原子)变量。
您无法检查其他线程是否正在等待互斥锁。
如果您确实需要这样的功能,您需要实现自己的功能。 与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。
为什么使用'return count> 1?count-1:0;'而不仅仅是'return count'? –
2William Rosenbloom 因为一个线程当前持有互斥体并做了一些工作,而不是等待互斥体。 – 4LegsDrivenCat
2naive_coach 首先解锁互斥锁然后减少计数会更安全一些,但即使在这种情况下,读者应该明白,应该谨慎使用此示例my_mutex,因为计数值可能会在您检查它的点和你采取一些行动的重点。所以它只能用在这个事实并不重要的情况下。 – 4LegsDrivenCat
如果两个线程正在等待一个锁,开始等待的线程首先是而不是保证是在线程变得可用时首先获取它的线程。所以,如果你是一个紧密循环线程谁做类似
while(true):
mutex.lock()
print "got the lock; releasing it"
mutex.unlock()
你可能会认为你是礼貌的所有其他线程等待锁,但你不是,系统可能只给你一遍又一遍的锁,不管其他线程是否跳入其中,无论他们等待多久。
条件变量是解决此问题的合理方法。
- 1. C++等待互斥
- 2. 如何让一个线程解锁另一个线程锁定的互斥锁?
- 3. 如何在OpenMP上等待互斥锁
- 4. pthread互斥锁两个线程互锁锁定/解锁是否有效?
- 5. 等待另一个线程
- 6. 等待线程被互斥锁阻塞的执行顺序
- 7. 线程是否在锁FIFO上等待?
- 8. 多线程互斥锁可以使用多个互斥锁
- 9. Linux互斥锁检查程序是否已经在运行?
- 10. 如何检查线程是否持有互斥体C++
- 11. 检查一个并行线程互斥锁定或解锁(后一个线程已经锁定本身)
- 12. 多线程和互斥锁
- 13. C++多线程互斥锁问题
- 14. 在Boost进程搜索中,线程停留在互斥锁中等待managed_shared_memory
- 15. 线程在同一互斥锁的多个锁上的行为
- 16. 这些线程中的每一个都等待,直到互斥锁被解锁以执行一个函数?
- 17. pthread_cond_wait不解锁互斥锁
- 18. 在使用互斥锁和等待数据时出现死锁
- 19. 尝试锁互斥锁或等待,直到解锁
- 20. ManualResetEvent大小检查是否足以等待多个线程?
- 21. 线程正在等待另一个线程
- 22. 了解互斥锁类
- 23. 如何等待,直到互斥锁解锁?
- 24. 互斥锁和锁
- 25. 检查一个孩子的PID是否正在等待Scanf
- 26. 等待互斥量,条件变量或I/O是否自动产生()线程?
- 27. boost :: mutex /如何测试一个互斥锁是否被锁定
- 28. Java中是否存在互斥锁?
- 29. 如何检查是否没有获取互斥锁?
- 30. 爪哇等待在另一个线程
这样的功能通常不会提供,因为它旁边没有用例,任何这样的信息已经被返回的信息过期了。 –