C++ 互斥 - 检查另一个线程是否正在等待
C++ Mutexes- Check if another thread is waiting
已经
锁定互斥锁的线程是否可以在不释放互斥锁的情况下检查另一个线程是否已经在等待?例如,假设一个线程有 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()
您可能认为您对所有其他等待锁定的线程都很礼貌,但事实并非如此,系统可能会一遍又一遍地为您提供锁定,而不会让任何其他线程跳入,无论它们已经等待了多长时间。
条件变量是解决此问题的合理方法。
相关文章:
- 检查值是否在集合p1和p2中,但不在p3中
- 如何检查函数是否在LLVM Instrumentation pass的ModulePass的系统头文件中定义?
- 检查类是否在方法中实例化
- 我是否在C++中投下新的结果?
- 如何检测是否在缓冲绘画动画中绘制最后一帧?
- ofstream::close() 是否在 Linux 上调用同步?
- 如何更好地检查两个 char 变量是否在一组值中?
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 成员访问是否在空指针上定义C++?
- 如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?
- C++ 移动语义是否在任何情况下都能节省资源?
- 数组对象的生存期是否在重用其元素存储时结束?
- 在等待时破坏condition_variable
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- C++11:16 字节原子<>变量是否在 16 字节边界上自动对齐,从而允许CMPXCHG16B指令?
- gcc 是否在 2 条短裤的过度对齐结构的比较中错过了优化机会?
- 从popen()读取的输出是否在pclose()之前完成
- 检查私有成员变量是否在一定范围内,如果没有调整
- 如何判断是否在编译时计算了"constexpr"(无需手动检查)
- 如果其他人在等待,是否有标准的STL或QT方法可以产生互惠码,否则请保留它