让我确保我理解C pthread mutex

时间:2013-03-20 22:29:13

标签: c pthreads mutex

我有一个全局变量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()然后[读取/ write] flag然后调用pthread_mutex_unlock()
  4. 这是对的吗?

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

        while(flag != value)
            continue;
    

    你会在lock()unlock()互斥的哪个地方,其他线程是否有机会访问flag,而main()会像这样一直在全面覆盖?

1 个答案:

答案 0 :(得分:1)

1 - 2 - 3 - 正确。

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

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

正如Ben在评论中指出的那样,你想使用条件变量进行信号传递(注:Pthread and wait conditions

  

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

作为规则的拇指,为了尽量减少争用,请尽量缩短锁定。这可以像lock + read + unlock一样简单,但是如果以下操作序列依赖于不应该更改标志的事实,那么只要需要就保持锁定。