【问题标题】:semaphore is accessing same data structure信号量正在访问相同的数据结构
【发布时间】:2018-05-31 18:48:32
【问题描述】:

我想更好地理解信号量。一个信号量允许 X 个线程(假设 10 个线程正在访问同一个线程函数)进入特定的线程函数,所以如果所有 10 个线程都试图同时访问同一个数据结构会发生什么。我们是否需要任何额外的锁定机制来避免这种情况。

【问题讨论】:

    标签: multithreading semaphore


    【解决方案1】:

    假设你有一个信号量:

    val s: Semaphore(1)
    

    它定义了一个初始计数为 1 的信号量。

    然后访问一个函数是通过:

    s.await()
    invoke_function()
    s.notify()
    

    如果您有 10 个线程,则每个线程将在信号量上执行 await(),但一次只能执行一个线程。信号量的操作保证了每次只有一个线程可以做invoke_function()

    最后,信号量上的notify() 释放资源并允许另一个线程访问该函数。

    await()notify() 之间的区域通常称为临界区。信号量本身提供对数据结构的访问锁定。

    但是,这种线程控制模型跳过了一些围绕底层内存模型的问题。

    【讨论】:

      【解决方案2】:

      就您的问题而言 - 当两个线程试图在同时获取原子资源时会发生什么。答案是 - 它不会同时发生。

      这些原子操作需要硬件级别的支持。在多线程/进程的情况下,总会有一个在另一个线程/进程执行之前获得硬件锁并使用原子指令(如英特尔架构上的LOCKCMPXCHG)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-30
        • 1970-01-01
        • 1970-01-01
        • 2021-12-18
        相关资源
        最近更新 更多