多个线程可以获得相同的锁吗?

时间:2016-02-03 20:24:32

标签: multithreading

如果我有这样的方法:

def getValue()
{
    lock.acquire();
    int result = data[index];
    lock.release();
    return result;
}

两个线程可以在同一时间到达lock.acquire()。那么会发生什么?

2 个答案:

答案 0 :(得分:2)

其中一个首先获得锁定,另一个必须等​​到第一个锁定释放锁定。如果它们在同一时间到达,那么决定哪一个获得锁定的机制在很大程度上取决于硬件。

我应该指出,虽然在同一时间没有""。要让不同线程中发生的两件事情在同一时间发生,就需要有一些全局的时间概念来命令操作。没有这样的事情。

此外,线程何时会达到"一项行动也没有明确界定。操作不会立即发生,操作可能与其他操作重叠。

答案 1 :(得分:0)

实际上,必须根据CPU级别上的原子操作来实现锁定:if lock_state is FREE then set lock_state to LOCKED else jump lock_failed

观察lock_state等于FREE并将其设置为LOCKED相对于同一CPU上的其他线程以及其他CPU上的线程必须是原子的,因此某种形式的内存锁定涉及CPU之间的访问。一种方法是通过高速缓存系统:一个CPU将包括操作值的内存范围设置为“专有”,因此其他CPU甚至无法尝试访问该字节范围,直到该CPU完成该操作为止。 (无论如何,这些拥有状态对于高速缓存一致性都是必需的。不涉及额外的内部CPU复杂性。)

因此,当lock_state的值为lock_state时,CPU首先要“独占”包括FREE的内存范围。

当锁定失败时,将涉及一个更为复杂的过程,以确保尝试锁定该线程的线程可以在锁定再次释放后立即暂停并重新启动。详细信息完全取决于系统。