如何创建锁定不同线程进入函数的锁? 线程1:A 线程2:C 线程3:C 线程4:B 线程5:C 主题6:B
“A”,“B”,“C”是创建时传递给线程的参数。
所以当我锁定这个锁X时,传入“A”和“B”的所有线程都无法继续,只有“C”类型的线程才能进入临界区。或者我是否必须为此示例制作6个不同的锁?
谢谢!
答案 0 :(得分:0)
您的要求含糊不清,但假设您希望并发读者使用相同的“允许字母”,那么您最好使用rwlock。 (如果你实际上只是想让一个“控制”线程设置允许A,B或C中的哪一个工作,而不是只要没有其他“字母”通过受控代码运行时A,B和C接管,那么需要一个不同的(更简单的)解决方案....)
作为第一个切入点(因此我们可以以更容易理解的方式“发展”解决方案),每个线程:
1)获取读者锁
2)如果“允许的字母”变量与他们的字母不同,他们会释放读取器锁定并尝试写入锁定
2a)获取编写器锁定时,他们会将允许的字母修改为自己的字母,然后释放该锁定并在1)重新启动(见下文)
3)做他们的工作
4)释放读卡器锁
这使用“writer”模式来影响允许字母的更改。如果你真的需要仲裁具有共享数据的写访问一些“允许信”的主题,你会想改变3)采取任何上的不同的的rwlock所读取器或写入器锁定,被释放在4)之前。
2a)创建一个竞争条件,比如一个线程获取编写器锁定然后设置允许的字母,当它释放锁定时,B线程可能会获得一个编写器锁定,然后才能获得读取器锁定来执行某些实际操作。 B线程然后可以释放写入器锁并且仅为了找到A而现在拥有它,因此两个线程都没有进展,但它们本身也没有死锁。这是否自行解决,主要取决于线程排队执行的rwlock中,但也对竞争条件,中断,抢占由于系统负载等。这可能在几方面加以解决,但它很容易,也许足够用一个额外的互斥锁,禁止其他带有写锁的线程修改允许的字母:它们可以在此使用trylock,如果失败则释放写锁并在1)重新启动。
所以,我们最终会得到一个或两个rwlocks和一个支持的互斥锁....