指向共享变量的指针互斥

Mutex on pointers to a shared variable

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

假设我有一个线程变量 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 互斥使您可以编写永远不会并行执行的代码,您可以选择该代码的作用 - 一种非常流行的模式是访问和修改共享变量.