首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个线程可以获取同一对象上的锁吗?

多个线程可以获取同一对象上的锁吗?
EN

Stack Overflow用户
提问于 2020-08-04 23:22:04
回答 2查看 292关注 0票数 0

我正在学习一门关于并发的课程。正文中说,多线程允许高吞吐量,因为它利用了cpu的多核。

我有一个关于在多核环境下锁定的问题。如果我们有多个线程,并且它们运行在不同的cpu核心中,为什么两个线程不能获得相同的锁呢?操作系统如何防范这种情况?

EN

回答 2

Stack Overflow用户

发布于 2020-08-04 23:51:25

当多个线程想要写入同一内存时,锁和锁用于同步,以防止数据损坏。

通常,您可以运行多个线程,并且仅在关键情况下才使用锁定。如果两个或更多线程想要在同一时间写入同一位置,那么多核计算是有限的。当然,在这种情况下您可以不使用锁定,但此时的结果可能是不可预测的。

例如,要编写矩阵乘法的多线程计算,您可以为结果矩阵的每一行创建一个线程。不需要锁定,因为每个线程都写入不同的位置,这种情况可以充分受益于多个处理器。

如果你想允许对一个资源的多个共享访问,那么你可以使用Semaphore (在java中)。

票数 0
EN

Stack Overflow用户

发布于 2020-08-05 00:52:25

如果我们有多个线程,并且它们运行在不同的cpu核心中,为什么两个线程不能获得相同的锁?

互斥锁的目的是实现 --一次只能有一个线程锁定一个互斥锁。或者,换句话说,根据定义,许多线程不能同时锁定同一互斥锁。需要这种机制来允许多个线程在没有data race条件的情况下存储到共享的非原子资源中或从共享的非原子资源中读取。

操作系统是如何防范这种情况的?

需要操作系统支持,以防止线程在锁定已被另一个线程锁定的互斥锁时忙碌等待。互斥锁(和信号量)的Linux实现使用futex让等待的线程进入睡眠状态,并在互斥锁释放时唤醒它们。

Here is a longer explanation from Linus Torvalds of how mutex is implemented.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63250052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档