multithreading - 当多个线程尝试完全同时访问关键部分时,会发生什么情况?

标签 multithreading thread-safety

我一直在寻找一个答案,所有我能找到的答案是,一旦线程到达关键部分,它将把它锁定在其他线程的前面(或者使用其他锁定机制来锁定关键部分)。
但这意味着线程实际上并没有在同一微秒内完全到达CS。
尽管我猜这很罕见,但它真的会发生吗,在这种情况下会发生什么?
我可以简单地假设程序会出现故障吗?
注意:我指的是多核CPU。
谢谢。

最佳答案

我认为您缺少诸如信号量之类的基本锁定原语的要点。如果使用正确的原语并且正确使用了原语,则线程的时间无关紧要。它们很可能是同时发生的。操作系统保证没有两个线程会进入关键部分。即使在多核计算机上,该位也是经过特殊实现的(甚至有很多技巧),以获得保证。
要专门解决您的问题,请执行以下操作:

But that implies that the threads didn't really reach the CS exactly at the same microsecond.


否。其他线程可能会在同一微秒内达到,但如果锁定机制正确,则只有一个竞争线程将“进入”关键部分,而其他线程将等待。

Although I guess it is quite rare, can it really happen, and what happens in this situation?


不管是否使用正确的锁定原语并且正确使用的稀有度,都不会有两个线程进入临界区。

Can I simply assume the the program will malfunction?


理想情况下,程序不应出现故障。但是任何代码都会有错误-您的代码和信号量的操作系统代码也会有错误。因此可以安全地假设在某些情况下程序确实会发生故障。但是,这种假设通常适用于所有代码。
锁定和关键部分很难正确实现。因此,出于非学术目的,我们应始终使用系统提供的锁定原语。所有操作系统都公开诸如信号量之类的东西,大多数编程语言都可以使用它们。某些编程语言拥有自己的轻量级实现,这些实现提供了一些较软的保证,但性能更高。正如我所说,在执行关键部分时,选择正确的东西并正确实现它至关重要。

关于multithreading - 当多个线程尝试完全同时访问关键部分时,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66731695/

相关文章:

java - notifyAll() 不起作用,如何在套接字编程中通知所有线程

python - 在客户端断开连接后,如何使twistedmatrix子进程继续处理?

Java 方法 NotifyAll() 不工作?

c - 在 Linux 中的不同线程之间缓冲 `printf` 输出

c++ - std::exception_ptr 线程安全吗?

android - 工作线程上的 PubNub

.net - 如何同时更新两个字典

java - 多线程 ThreadSeven 扩展了 Thread

Java HashTable size() 后跟 value() 在线程中安全吗?

c - 静态内联函数线程安全吗?