我想问一下是否可以使用与 2 个互斥锁关联的 1 个条件变量来进行 2 种数据更新。
基本上,我有thread1和thread2。Thread1 可以等待 2 种数据更新,所以它有 2 个互斥锁,每个互斥锁一个。(我知道我可以对所有这些数据使用一个互斥锁,但这不是这个问题的重点,对吗?)而且我当然不希望它在 data1 上等待 data2 已经可用,所以它只有 1 个条件变量. 而thread2 将同时提供data1 和data2。问题是在thread2中,我不知道thread1现在是在等待data1还是data2,还是根本不等待。
伪代码如下所示:
global data:
cond_var
mutex1
data1
mutex2
data2
thread1:
while true
lock1.lock(mutex1)
if data1 is not available
cond_var.wait(lock1)
if data1 is available
process data1
lock1.unlock()
lock2.lock(mutex2)
if data2 is not available
cond_var.wait(lock2)
if data2 is available
process data2
lock2.unlock()
thread2:
func1:
lock1.lock(mutex1)
update data1
cond_var.notify_all()
lock1.unlock()
func2:
lock2.lock(mutex2)
update data2
cond_var.notify_all()
lock2.unlock()
外界会调用 func1 或 func2 来更新数据。当func1或func2被调用时,它会发信号cond_var,无论是在lock1还是lock2。cond_var 的等待没有被 while 包围,所以如果 cond_var 在 lock1 上被唤醒,但 data2 可用,thread1 会继续处理 data2。
实际的实现是通过 boost::thread,由于我的测试平台是 Linux,所以 boost::thread 应该通过 pthread 实现。
在我阅读的几乎所有关于条件变量的教程和文档中,它只与 1 个互斥锁相关联。所以我很想知道上面的程序是否可以使用,或者根本上存在缺陷。