指向共享变量的指针上的互斥锁

时间:2015-07-09 16:23:07

标签: c multithreading thread-safety pthreads mutex

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

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

你能证实吗?你也可以说明为什么它是真的或为什么它不是真的?

我正在使用c和pthreads。

1 个答案:

答案 0 :(得分:2)

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

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

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

  

如果在第二个帖子中我在我之前锁定了一个互斥锁,那么代码是否安全   使用指针变量?

修改a的值

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

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

至于这个评论:

  

如果在使用p之前锁定了互斥锁,那么a和p都是   保护?结论是每个存储器参考存在   互斥锁被锁定的部分受到保护,即使存储器是   间接引用?

互斥锁不保护内存区域或引用,它们保护代码区域。无论您在锁定和解锁之间做出什么都是独一无二的;而已。因此,如果每个线程访问或修改ap之前锁定相同的互斥锁并在之后解锁,则作为副作用您已同步访问。

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