我正在学习一门关于并发的课程。正文中说,多线程允许高吞吐量,因为它利用了cpu的多核。
我有一个关于在多核环境下锁定的问题。如果我们有多个线程,并且它们运行在不同的cpu核心中,为什么两个线程不能获得相同的锁呢?操作系统如何防范这种情况?
发布于 2020-08-04 23:51:25
当多个线程想要写入同一内存时,锁和锁用于同步,以防止数据损坏。
通常,您可以运行多个线程,并且仅在关键情况下才使用锁定。如果两个或更多线程想要在同一时间写入同一位置,那么多核计算是有限的。当然,在这种情况下您可以不使用锁定,但此时的结果可能是不可预测的。
例如,要编写矩阵乘法的多线程计算,您可以为结果矩阵的每一行创建一个线程。不需要锁定,因为每个线程都写入不同的位置,这种情况可以充分受益于多个处理器。
如果你想允许对一个资源的多个共享访问,那么你可以使用Semaphore (在java中)。
发布于 2020-08-05 00:52:25
如果我们有多个线程,并且它们运行在不同的cpu核心中,为什么两个线程不能获得相同的锁?
互斥锁的目的是实现 --一次只能有一个线程锁定一个互斥锁。或者,换句话说,根据定义,许多线程不能同时锁定同一互斥锁。需要这种机制来允许多个线程在没有data race条件的情况下存储到共享的非原子资源中或从共享的非原子资源中读取。
操作系统是如何防范这种情况的?
需要操作系统支持,以防止线程在锁定已被另一个线程锁定的互斥锁时忙碌等待。互斥锁(和信号量)的Linux实现使用futex让等待的线程进入睡眠状态,并在互斥锁释放时唤醒它们。
Here is a longer explanation from Linus Torvalds of how mutex is implemented.
https://stackoverflow.com/questions/63250052
复制相似问题