我怀疑第三方库本质上是pthread的包装 这是它的连接函数的实现方式:
bool Join() throw ()
{
ThreadState s;
{
CCriticalSectionLock L(m_CS);
s = m_CurrentThreadState;
}
if (s == Started) {...}
}
不应该将if (s == Started) {...}
代码放在定义锁定的块中吗?
实际上,关键部分仅包含变量赋值,即基本操作不需要它。
谢谢。
答案 0 :(得分:2)
关键部分的要点是保护m_CurrentThreadState
字段的读取,这可能会被其他线程更改。
答案 1 :(得分:2)
不应该将
if (s == Started) {...}
代码放在定义锁的块中吗?
简答:不。
更长的答案:不,因为关键部分仅涵盖m_CurrentThreadState
的状态。
在这段代码中,s
是一个本地堆栈变量,每个线程都有自己的副本(即不需要保护它)。
代码阻止访问m_CurrentThreadState
并读取其值(进入s
)。然后,它使用s中的值(即使另一个线程修改m_CurrentThreadState
也是一致的。)
答案 2 :(得分:1)
关键部分确保以原子方式读取共享变量(m_CurrentThreadState
)。 C ++不保证基本操作是原子操作,尽管现在可以使用std::atomic
而不是锁。
是否需要为任何逻辑维护锁,因为访问是一个需要仔细分析线程如何交互的问题。希望图书馆作者进行分析,并确定在不保持锁定的情况下对值进行操作是安全的。
答案 3 :(得分:1)
变量s
是m_CurrentThreadState
看起来函数想要在很短的时间内保持锁定,因此检查这个状态值的副本。
如果此时状态值发生变化并不重要,无论如何都会执行代码。