我有一个全局变量flag
,一个函数this()
和一个函数that()
。现在,main()
,this()
和that()
都有需要阅读和/或写flag
的场合。要正确使用互斥锁,我需要:
pthread_mutex_t
并初始化它。this()
和that()
以及pthread_join()
创建线程,因为我希望main()
等待this()
和that()
完成,然后退出main()
,this()
还是that()
,其中flag
正在被读取或写入,请调用pthread_mutex_lock()
然后[读取/ write] flag
然后调用pthread_mutex_unlock()
这是对的吗?
我不打算这样做但是如果我想在flag
这样的无限循环中检查main()
:
while(flag != value)
continue;
你会在lock()
和unlock()
互斥的哪个地方,其他线程是否有机会访问flag
,而main()
会像这样一直在全面覆盖?
答案 0 :(得分:1)
1 - 2 - 3 - 正确。
现在,如果你写那个循环,那么
flag
需要原子可更新,而其他核心需要看到这些变化。并非所有架构保证这个)。即使它有效,它仍然是一个繁忙的等待循环,不应该使用。正如Ben在评论中指出的那样,你想使用条件变量进行信号传递(注:Pthread and wait conditions)
你在哪里锁定()和解锁()互斥锁
作为规则的拇指,为了尽量减少争用,请尽量缩短锁定。这可以像lock + read + unlock一样简单,但是如果以下操作序列依赖于不应该更改标志的事实,那么只要需要就保持锁定。