对象的ctor和dtor必须在同一个帖子上吗?

时间:2017-07-07 17:17:57

标签: c++ multithreading raii

使用C ++ RAII,当对象超出范围时,会调用dtor。多线程的机制总是涉及传递回调以在新线程上运行。因此,我不认为一个对象可以在一个线程中构建并在另一个线程中被破坏,因为这些对象必须是不同的范围。

我是对的吗?或者是否存在可以在不同线程中调用对象ctor和dtor的情况?

2 个答案:

答案 0 :(得分:3)

  

因此,我不认为一个对象可以在一个线程中构建并在另一个线程中被破坏,因为这些对象必须是不同的范围。

     

我对此是对的吗?

没有。可以完全独立于任何线程调用这些函数。

  

或者是否存在可以在不同线程中调用对象ctor和dtor的情况?

当然有案例(只是每日面包和黄油)。考虑一个简单的生产者/消费者模型以及通过队列在线程之间交换的消息实例。

生产者线程创建消息实例并将其推入队列。消费者将其从队列中取出,消息析构函数将在处理后被调用。

答案 1 :(得分:3)

  

多线程机制总是涉及传递回调以在新线程上运行。

假。在很多情况下,您只需要另一个线程来处理事情或在后台管理某些内容但不关心状态。此外,除了回调之外还有其他信令方法(只有一个例子是conditional variables)。

旁注:可以在任何线程上调用回调,包括传递回调的线程。这一切都取决于你如何设计系统。每次调用回调时都不必创建新的线程(尽管这是一种方法)。

  

因此,我不认为一个对象可以在一个线程中构建并在另一个线程中被破坏,因为那些对象必须是不同的范围。

假。 Shared pointers允许指向要在线程周围传递的对象的指针,一旦删除了对该对象的所有引用,就会破坏该对象。

一个例子是网络线程,它构造一个对象来表示从网络接收的一些消息。然后该线程将该对象放在共享队列上,并将一些其他处理线程处理该消息。一旦处理线程完成,它就可以破坏对象并释放资源用于其他事情。