【发布时间】:2018-05-31 18:48:32
【问题描述】:
我想更好地理解信号量。一个信号量允许 X 个线程(假设 10 个线程正在访问同一个线程函数)进入特定的线程函数,所以如果所有 10 个线程都试图同时访问同一个数据结构会发生什么。我们是否需要任何额外的锁定机制来避免这种情况。
【问题讨论】:
我想更好地理解信号量。一个信号量允许 X 个线程(假设 10 个线程正在访问同一个线程函数)进入特定的线程函数,所以如果所有 10 个线程都试图同时访问同一个数据结构会发生什么。我们是否需要任何额外的锁定机制来避免这种情况。
【问题讨论】:
假设你有一个信号量:
val s: Semaphore(1)
它定义了一个初始计数为 1 的信号量。
然后访问一个函数是通过:
s.await()
invoke_function()
s.notify()
如果您有 10 个线程,则每个线程将在信号量上执行 await(),但一次只能执行一个线程。信号量的操作保证了每次只有一个线程可以做invoke_function()。
最后,信号量上的notify() 释放资源并允许另一个线程访问该函数。
await() 和notify() 之间的区域通常称为临界区。信号量本身提供对数据结构的访问锁定。
但是,这种线程控制模型跳过了一些围绕底层内存模型的问题。
【讨论】:
就您的问题而言 - 当两个线程试图在同时获取原子资源时会发生什么。答案是 - 它不会同时发生。
这些原子操作需要硬件级别的支持。在多线程/进程的情况下,总会有一个在另一个线程/进程执行之前获得硬件锁并使用原子指令(如英特尔架构上的LOCK 和CMPXCHG)。
【讨论】: