如何创建一个锁,使不同的线程不能进入函数?线程1: A线程2: C线程3: C线程4: B线程5: C线程6: B
"A“、"B”、"C“是线程创建时传入的参数。
所以当我锁定这个锁X时,所有传入了"A“和"B”的线程都不能继续,只有"C“类型的线程才能进入临界区。或者我必须为这个例子制作6个不同的锁?
谢谢!
发布于 2014-02-06 13:41:08
您的需求是模糊的,但是假设您想要具有相同“允许的字母”的并发读取器,那么最好使用rwlock。(如果您实际上只想要一个“控制”线程来设置允许A、B或C中的哪一个工作,而不是让A、B和C在没有其他“字母”运行时接管受控代码,那么就需要一个不同的(更简单的)解决方案……)
作为第一个切入点(这样我们就可以以一种更容易理解的方式“演变”一个解决方案),每个线程:
1)获取读取器锁
2)如果"allowed letter“变量与它们的字母不同,它们会释放读锁定并尝试使用写锁定
在获得写入器锁时,他们将允许的字母修改为自己的,然后释放该锁并在1)处重新启动(见下文)
3)做他们的工作
4)释放读卡器锁
这使用“写入器”模式来影响允许字母的更改。如果你真的需要仲裁一些“允许的字母”线程对共享数据的写访问权限,你会想要改变3)在一个不同的rwlock上获得一个读取器或写入器锁,在4)之前释放。
2a)创建争用条件,例如A线程获得写入器锁,然后设置允许的字母,当它释放锁时,B线程可能在它可以获得读取器锁来做一些实际工作之前获得写入器锁。然后,B线程可能会释放写锁并去寻找读锁,结果发现A现在拥有它,所以线程都不会进行,但它们本身也不会死锁。这是否会自行解决主要取决于rwlock的线程队列实现,还取决于竞争条件、中断、由于系统负载而导致的抢占等。这可以通过几种方式来解决,但是使用额外的互斥锁来禁止其他具有写锁的线程修改允许的字母是很容易的,而且可能已经足够了:他们可以对此使用they lock,如果它失败了,那么释放他们的写锁并在1)处重新启动。
因此,我们最终得到了一个或两个rwlock和一个支持互斥...
https://stackoverflow.com/questions/21593275
复制相似问题