假设我锁定了一个互斥体。有无限数量的其他线程等待锁定互斥体。当我解锁互斥体时,将选择其中一个线程进入临界区。但我无法控制哪一个。如果我想让特定线程进入临界区怎么办?
我很确定这不能使用 POSIX 互斥体来完成,但是,我可以使用不同的同步对象来模拟该行为吗?
最佳答案
您可以使用互斥体、条件变量和线程 ID 来实现这一点。
在解锁互斥体之前,线程设置目标线程 ID、广播条件变量并释放互斥体。等待的线程醒来,锁定互斥体并检查目标线程ID是否等于该线程ID。如果没有,线程返回等待。
对此方法的优化是为每个等待线程使用单独的条件变量,以避免仅仅为了检查目标线程 ID 而唤醒所有等待线程,然后返回等待。这样,信号线程将通知特定目标线程的条件变量。
另一种选择是使用发送到特定线程的信号。假设我们使用 SIGRTMIN
来实现此目的。首先,所有线程在开始时都会阻止该信号,以便该信号变为待处理状态,并且在线程不等待该信号时不会丢失。当线程想要锁定互斥体时,它首先调用 sigwait()
,它会自动解锁 SIGRTMIN
并等待它或传递一个已经挂起的互斥体。一旦线程收到信号,它就可以继续并锁定互斥体。信号线程使用 pthread_kill(target_thread_id, SIGRTMIN) 来唤醒特定线程。
关于multithreading - 如何将互斥体的所有权授予特定线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12702521/