加入线程

时间:2012-12-03 15:45:47

标签: c++ multithreading join pthreads

我怀疑第三方库本质上是pthread的包装 这是它的连接函数的实现方式:

            bool Join() throw ()
            {
                ThreadState s;
                {
                    CCriticalSectionLock L(m_CS);
                    s = m_CurrentThreadState;
                }

                if (s == Started) {...}
            }

不应该将if (s == Started) {...}代码放在定义锁定的块中吗?

实际上,关键部分仅包含变量赋值,即基本操作不需要它。

谢谢。

4 个答案:

答案 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)

变量sm_CurrentThreadState

的副本

看起来函数想要在很短的时间内保持锁定,因此检查这个状态值的副本。

如果此时状态值发生变化并不重要,无论如何都会执行代码。