信号量正在访问相同的数据结构

时间:2018-05-31 18:48:32

标签: multithreading semaphore

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

2 个答案:

答案 0 :(得分:0)

假设你有一个信号量:

val s: Semaphore(1)

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

然后通过以下方式访问函数:

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

如果你有10个线程,那么每个线程将在信号量上执行await(),但一次只能执行一个线程。信号量的操作确保一次只有一个线程可以invoke_function()

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

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

但是,这种线程控制模型会跳过围绕底层内存模型的许多问题。

答案 1 :(得分:0)

对于你的问题部分 - 当两个线程试图在同一时间获取原子资源时会发生什么。答案是 - 它不会完全同时发生。

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