gpt4 book ai didi

c - 指向共享变量的指针互斥

转载 作者:太空宇宙 更新时间:2023-11-04 02:41:37 24 4
gpt4 key购买 nike

我是线程编程的新手。我知道互斥量用于保护对多线程程序中共享数据的访问。

假设我有一个带有变量 a 的线程和第二个带有指针变量 p 的线程a 的地址。如果在第二个线程中,我在使用指针变量修改 a 的值之前锁定互斥体,代码是否安全?据我了解,它是安全的。

你能确认一下吗?并且您能否提供它为真或不为真的原因?

我正在使用 c 和 pthreads。

最佳答案

进行多线程处理时的一般规则是,读取和写入的线程之间的共享变量需要串行访问,这意味着您必须使用某种同步原语。互斥量是一种流行的选择,但无论您最终使用什么,您只需要记住,在读取或写入共享变量之前,您需要获取锁以确保一致性。

因此,只要代码中的每个线程都同意在访问给定变量之前始终使用相同的锁,就没有问题。

现在,回答您的具体问题:

Is the code safe if, in the second thread, I lock a mutex before I modify the value of a using the pointer variable?

这取决于。您如何在第一个线程上读取 a?第一个线程在以任何方式访问 a 之前也需要锁定互斥量。如果两个线程在读取或写入 a 的值之前锁定同一个互斥量,那么它是安全的。

这是安全的,因为互斥锁和解锁之间的代码区域是互斥的(只要每个线程都遵守规则,即在执行 Y 之前,它们需要获取锁 X), 因为一次只有一个线程可以拥有锁。

至于这条评论:

And if the mutex is locked before p is used, then both a and p are protected? The conclusion being that every memory reference present in a section where a mutex is locked is protected, even if the memory is indirectly referenced?

互斥量不保护内存区域或引用,它们保护代码区域。你在锁定和解锁之间做的任何事情都是排他性的;就是这样。因此,如果每个访问或修改 ap 的线程在之前锁定同一个互斥量并在之后解锁,那么作为副作用你具有同步访问权限。

TL;DR 互斥量允许您编写永远不会并行执行的代码,您可以选择该代码的作用 - 一种非常流行的模式是访问和修改共享变量。

关于c - 指向共享变量的指针互斥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31323107/

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