【问题标题】:pthreads reading and writing to the same variablepthreads读取和写入同一个变量
【发布时间】:2014-04-28 05:12:21
【问题描述】:

我知道我应该使用互斥锁,但我目前使用 pthread 的方式会使程序过于复杂...

无论如何,我基本上都有一个变量,用于表示线程当前是否正在执行工作。在主线程中,我在一个while循环中运行它,检查哪些线程不再忙。现在显然我的线程一旦完成就可以写入同一个变量。

是否允许从 2 个不同的线程读取和写入同一个变量,如果 1 个线程仅读取而 1 个线程仅写入。读取旧版本并不重要,因为它只会在下一次迭代中读取正确的一次。

那么做这样的事情安全吗?

【问题讨论】:

标签: c linux multithreading pthreads


【解决方案1】:

一般来说,没有。

以下文章解释了原因:

http://www.domaigne.com/blog/computing/mutex-and-memory-visibility/

以下是充当内存屏障的 API 函数列表:

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_11

【讨论】:

  • 谢谢!然而,这个来自 oracle 的文档确实做了类似的事情,它有 2 个函数来写入和读取变量。如果我理解正确,尽管这仍然允许同时写入和读取,但不能同时进行多次读取或写入:docs.oracle.com/cd/E19455-01/806-5257/sync-12/index.html
  • 该代码正在使用pthread_mutex,它充当内存屏障。
  • 是的,pthread_mutex_unlock 用于确保所有之前的写入都变得全局可见。
  • 互斥锁和互斥锁保护的内存是分开的。互斥体实际保护的内容由您决定。每当您访问关联的内存时,您必须通过持有正确的互斥锁来强制执行此操作。释放互斥锁保证 所有 之前的写入都变得全局可见;不仅仅是您打算用互斥锁保护的那些。
  • 为了进一步澄清,释放互斥锁保证所有先前的写入对于随后获取相同互斥锁的任何线程都是可见的。
猜你喜欢
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多