【问题标题】:Let me make sure I understand C pthread mutex让我确保我了解 C pthread mutex
【发布时间】:2013-03-20 22:29:12
【问题描述】:

我有一个全局变量flag、一个函数this()和一个函数that()。现在,main()this()that() 都有需要读取和/或写入flag 的场合。要正确使用互斥锁,我需要:

  1. 声明一个pthread_mutex_t并初始化它。
  2. this()that()pthread_join() 创建线程,因为我希望main() 在退出之前等待this()that() 完成。
  3. 代码中的任何位置,无论是main()this() 还是that(),其中flag 正在被读取或写入,调用pthread_mutex_lock() 然后[读/写] flag 然后调用@987654341 @

对吗?

我不打算这样做,但如果我想像这样在main() 中无限循环地检查flag

    while(flag != value)
        continue;

lock()unlock() 互斥锁在哪里?其他线程是否有机会访问 flag,而 main() 会一直这样?

【问题讨论】:

  • 你会想要最后一个循环的 pthread 条件。
  • 将 pthread 对象用于预期用途。互斥锁保护对某物(或某物)的访问,而条件变量用于向一个或多个潜在相关方发出谓词变化的信号。如果配合得当,你写出的任务既优雅又相当琐碎。

标签: c pthreads mutex


【解决方案1】:

1 - 2 - 3 - 正确。

现在,如果你写那个循环,那么

  • 由于 3,主线程将持有锁,而其他线程将无法获取锁,因此实际上,您创建了一个无限循环。
  • 如果你不加锁,那么它可能不起作用,这取决于 CPU 架构(首先,flag 需要可原子更新,其他内核需要看到这些更改。并非所有架构都能保证这一点)。即使它有效,它仍然是一个繁忙的等待循环,不应该使用。

正如 Ben 在他的评论中指出的,您希望使用条件变量来发出信号(注意:Pthread and wait conditions

你会在哪里锁定()和解锁()互斥锁

作为一个经验法则,为了尽量减少争用,保持锁的时间越短越好。这可以像 lock+read+unlock 一样简单,但如果以下操作顺序取决于标志不应更改的事实,则根据需要保持锁定。

【讨论】:

  • 谢谢。这或多或少是我的想法,只是想在我第一次涉足互斥锁之前确保我掌握了它的要点。我阅读并重新阅读手册页并查看了来自各种来源的几个示例,最后我仍然不确定我是否掌握了它。 @WhozCraig - 对于像我这样的新手、自学成才的人来说,这是很重的东西;)
猜你喜欢
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2011-04-25
相关资源
最近更新 更多