在线程A中创建对象,在线程B中使用。需要Mutex吗?

时间:2017-09-04 08:21:31

标签: c++ multithreading mutex

我一直在阅读有关多线程,C ++,正确同步和锁定的不同内容,以防止竞争条件。但是,有一个问题没有得到解答: 如果我在线程A中创建一个对象,是否需要互斥锁,但之后在线程B中专门使用它?

换句话说,我知道我不需要互斥锁来防止竞争条件 - 我是否需要互斥锁作为内存屏障(或其他潜在问题)?

可视化我的意思的一个非常基本的例子

struct Object {
    void do_stuff();
};

Object o;
std::thread worker_thread([&o](){
    while (alive)
        o.do_stuff();
}).join();
// `o` is never used outside worker_thread

如果您还可以向我推荐文章/书籍,我可以在这里阅读更多内容和/或正确的关键词来搜索这些场景,我会很高兴。

1 个答案:

答案 0 :(得分:18)

这很好,你不需要mutex

创建线程会设置内存屏障,因此可以通过传递给o的引用访问worker_thread

§30.3.2.2-6 - [thread.thread.constr]

  

完成构造函数的调用与f副本的调用开始同步。

worker_thread正在运行时,显然您可能无法访问创建它的线程中的o(正如您所说)。

加入线程也会设置障碍,因此在worker_thread加入后,您可以在主线程中再次访问o

§30.3.2.5-4 - [thread.thread.destr]

  

由*表示的线程的完成与(1.10)相应的成功join()返回同步。

进一步阅读:

  • Anthony Williams写了一本关于并行编程的好书( C ++并发行动
  • Bjarne Stroustrup的书( C ++编程语言,第4版)有两个关于并发编程的好章节。
  • Jeff Preshing有很多关于这些主题的博客;看看preshing.com