【问题标题】:How can any thread signal for release of a binary semaphore任何线程如何发出二进制信号量的释放信号
【发布时间】:2015-07-12 13:04:08
【问题描述】:

我是多线程范例的新手。在学习并发时,我发现的每个来源都说:

"互斥量和二进制信号量的区别在于所有权 即一个互斥锁只能由线程发出释放信号 在可以向任何线程发出信号时创建它”

考虑线程 A 在资源 x 上获得二进制信号锁并对其进行处理的情况。如果任何线程都可以为 x 上的锁调用释放信号,这是否会在线程 A 使用 x 的时间段内打开任何线程调用锁上释放的可能性。

这不是不一致的范围还是我遗漏了什么?

【问题讨论】:

    标签: multithreading concurrency locking mutex semaphore


    【解决方案1】:

    当然,如果线程任意获取或释放信号量,结果将是灾难性的,而且实现并不能阻止这一点的事实并不意味着这是一个有用的场景。

    但是,如果所涉及的线程使用另一种机制来协调自己,同时使用信号量来阻止这些不参与这些协调的线程,则可能会有实际用例。

    假设您扩展一个用例,其中一个线程获取信号量以执行任务以并行执行所述任务。获取信号量后,会产生几个工作线程,每个工作线程处理数据的不同部分,因此自然不会干扰工作。然后 last 工作线程释放信号量,这消除了启动线程和工作线程之间另一个通信的需要。当然,这需要工作线程来检测它是否是最后一个,但是一个简单的原子整数保存活动工作人员的数量就足够了。

    【讨论】:

    • 这样使用信号量不会导致另一个开销的空间,我们现在正在使用另一种技术来防止一致性吗?这不是首先创建信号量的主要原因吗? (使用同步保持一致性)
    • 使用这种更复杂的解决方案而不是简单的解决方案的原因与我们为什么使用多个不同的信号量或锁而不是一个全局锁的原因相同(或者为什么我们使用多线程全部)。简单的解决方案并不总是令人满意。但是,您不应该在没有实际问题要解决的情况下提高程序的复杂性,这是正确的。
    猜你喜欢
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2012-10-07
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    相关资源
    最近更新 更多