【问题标题】:how to lock for a variety of threads pthread_mutex_lock如何为各种线程加锁 pthread_mutex_lock
【发布时间】:2014-02-06 03:14:39
【问题描述】:

你如何创建一个锁来锁定不同的线程进入函数? 线程 1:A 线程 2:C 线程 3:C 线程 4:B 线程 5:C 线程 6:B

“A”、“B”、“C”是线程创建时传入的参数。

所以当我锁定这个锁 X 时,所有传入“A”和“B”的线程都无法继续,只有“C”类型的线程可以进入临界区。或者我必须为这个例子制作 6 个不同的锁吗?

谢谢!

【问题讨论】:

  • 3个锁:A、B、C。如果你只想C通过,锁A和B,通过try lock进入临界区。而且你没有提到顺序,所以也许全局变量就足够了。

标签: c++ c multithreading pthreads


【解决方案1】:

您的要求含糊不清,但假设您希望并发阅读器具有相同的“允许的字母”,您最好使用 rwlock。 (如果您实际上只是想要一个“控制”线程来设置允许 A、B 或 C 中的哪一个工作,而不是让 A、B 和 C 在没有其他“字母”通过受控代码运行时接管,那么需要一个不同的(更简单的)解决方案....)

作为第一个切入点(因此我们可以以更易于理解的方式“发展”解决方案),每个线程:

1) 获得读卡器锁

2)如果“允许的字母”变量与他们的字母不同,它们会释放读取器锁并尝试写入器锁

    2a) 在获得写入器锁时,他们将允许的字母修改为自己的,然后释放该锁并在 1) 处重新启动(见下文)

3) 做他们的工作

4) 释放读卡器锁

这使用“编写器”模式来影响允许字母的更改。如果您确实需要仲裁一些对共享数据具有写访问权限的“允许的字母”线程,您将需要更改 3) 在要释放的 distinct rwlock 上获取读取器或写入器锁定4) 之前。

2a) 创建一个竞争条件,比如 A 线程获得写入者锁,然后设置允许的字母,当它释放锁时,B 线程可能会在获得读取器锁来做一些实际工作之前获得写入器锁.然后 B 线程可能会释放写入者锁并寻求读取者锁,但发现 A 现在拥有它,因此线程不会继续前进,但它们本身也不会死锁。这是否自行解决主要取决于 rwlock 的线程队列实现,还取决于竞争条件、中断、由于系统负载引起的抢占等。这可以通过多种方式解决,但它很容易并且可能足够使用一个额外的互斥锁,以禁止具有写锁的其他线程修改允许的字母:他们可以对此使用 trylock,如果失败则释放其写锁并在 1) 处重新启动。

所以,我们最终得到一两个 rwlock 和一个支持互斥锁......

【讨论】:

    猜你喜欢
    • 2021-03-08
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2021-11-08
    • 2011-07-13
    • 2013-02-20
    • 1970-01-01
    相关资源
    最近更新 更多