想象一下我锁定了互斥锁。有无限数量的其他线程等待锁定互斥锁。当我解锁互斥锁时,将选择其中一个线程进入临界区。但是我无法控制哪一个。如果我想要特定的线程进入临界区怎么办?
我很清楚使用POSIX互斥锁无法做到这一点,但是,我可以使用不同的同步对象来模拟行为吗?
答案 0 :(得分:4)
您可以使用互斥锁,条件变量和线程ID来实现该功能。
在解锁互斥锁之前,线程设置目标线程ID,广播条件变量并释放互斥锁。等待线程唤醒,锁定互斥锁并检查目标线程id是否等于此线程ID。如果没有,线程会回来等待。
对此方法进行优化以避免唤醒所有等待线程只是为了检查目标线程ID然后返回等待将为每个等待线程使用单独的条件变量。这样,信令线程将通知特定目标线程的条件变量。
另一种选择是使用发送到特定线程的信号。假设我们为此目的使用SIGRTMIN
。首先,所有线程在开始时阻止此信号,以便信号变为挂起并且在线程不等待时不会丢失。当线程想要锁定互斥锁时,它首先调用sigwait()
,它会原子地解锁SIGRTMIN
并等待它或传递已经挂起的互斥锁。pthread_kill(target_thread_id, SIGRTMIN)
。一旦线程收到信号,它就可以继续并锁定互斥锁。信令线程使用{{1}}唤醒特定线程。