gpt4 book ai didi

multithreading - 互斥锁有什么作用?

转载 作者:行者123 更新时间:2023-12-05 03:17:56 25 4
gpt4 key购买 nike

在每个关于互斥的教程中,互斥都被描述为一种防止例如多个线程同时访问相同资源的方法。但是那些资源是什么。我知道资源可以是很多东西,例如变量,但是我如何定义那些不应该被另一个线程同时使用的变量? Mutex 如何知道要“锁定”哪些变量?我不明白编译器如何在执行代码之前知道 Mutex 应该在函数 mutex.lock 和 mutex.release 之间锁定什么。

最佳答案

答案取决于您想如何思考。

在低层次上,互斥锁只锁定它自己。永远不允许两个线程同时锁定同一个互斥体。故事结束。

在更高的层次上,互斥体可以锁定你想用它锁定的任何数据。互斥锁是一种咨询锁。它就像卡在门 Handlebars 上的标志,上面写着“正在使用中,请勿进入”。它会将尊重标志的人拒之门外,但它没有实际的权力将任何人拒之门外。

如果您有一些数据由多个线程共享,并且您不希望任何两个线程同时访问*该数据,那么您可以设置一个互斥锁,并声明“除非锁定了互斥量,否则任何人都不得访问这些数据。”该声明就是 @Wyck 在上面的评论中所说的“协议(protocol)”。

有责任确保您的程序中的任何线程都不会在不锁定互斥锁的情况下访问数据。也就是说,由您来确保您的代码遵守协议(protocol)。

另请注意!我没有在任何地方提到“方法”或“功能”。锁定方法或函数从来没有任何内在的好处。它始终与方法或函数访问的数据有关。


*“访问”不仅仅意味着“更新”。如果一个线程只是试图读取数据,而其他线程正在更新它,则读取线程可能会看到不一致或无效的数据快照,并且它可能会做出任意错误的决定在它看到的东西上。后果可能对过程是致命的,或者更糟。

关于multithreading - 互斥锁有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73896766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com