multithreading - 如何将互斥体的所有权授予特定线程?

标签 multithreading mutex critical-section

假设我锁定了一个互斥体。有无限数量的其他线程等待锁定互斥体。当我解锁互斥体时,将选择其中一个线程进入临界区。但我无法控制哪一个。如果我想让特定线程进入临界区怎么办?

我很确定这不能使用 POSIX 互斥体来完成,但是,我可以使用不同的同步对象来模拟该行为吗?

最佳答案

您可以使用互斥体、条件变量和线程 ID 来实现这一点。

在解锁互斥体之前,线程设置目标线程 ID、广播条件变量并释放互斥体。等待的线程醒来,锁定互斥体并检查目标线程ID是否等于该线程ID。如果没有,线程返回等待。

对此方法的优化是为每个等待线程使用单独的条件变量,以避免仅仅为了检查目标线程 ID 而唤醒所有等待线程,然后返回等待。这样,信号线程将通知特定目标线程的条件变量。


另一种选择是使用发送到特定线程的信号。假设我们使用 SIGRTMIN 来实现此目的。首先,所有线程在开始时都会阻止该信号,以便该信号变为待处理状态,并且在线程不等待该信号时不会丢失。当线程想要锁定互斥体时,它首先调用 sigwait() ,它会自动解锁 SIGRTMIN 并等待它或传递一个已经挂起的互斥体。一旦线程收到信号,它就可以继续并锁定互斥体。信号线程使用 pthread_kill(target_thread_id, SIGRTMIN) 来唤醒特定线程。

关于multithreading - 如何将互斥体的所有权授予特定线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12702521/

相关文章:

C# 以 CPU 友好的方式使事件处理线程保持事件状态

c++ - Boost 的作用域互斥锁和 WinAPI 的临界区有区别吗?

windows - 断言当前线程不持有 CRITICAL_SECTION 锁

c++ - 需要帮助解决 Eigen 数组并行构造中的数据争用

Java 同步块(synchronized block)意外行为

linux - 如何为 pthreads 中的锁定互斥锁获取拥有线程的线程 ID

c++ - 为什么 condition_variable_any 需要一个由 shared_ptr 管理的互斥体?

java - 如何同步线程: onTouchEvent and run()?

c++ - 究竟什么是临界区?

c# - 从任务返回而不阻塞 UI 线程