对象的 ctor 和 dtor 必须在同一个线程上吗?
Must an object's ctor and dtor be on the same thread?
使用 C++ RAII,当对象超出范围时将调用 dtor。多线程机制总是涉及将回调传递给新线程上的运行。因此,我认为一个对象不可能在一个线程中构造并在另一个线程中被破坏,因为它们必须是不同的范围。
我说得对吗?或者在某些情况下可以在不同线程中调用对象 ctor 和 dtor?
Thus, I don't think it's possible for an object to be constructed in one thread and destructed in another, since those would have to be different scopes.
Am I right about this?
没有。这些函数可以完全独立于任何线程调用。
Or are there some cases where an objects ctor and dtor can be called in different threads?
当然有这种情况(只是日常面包和黄油)。考虑一个简单的生产者/消费者模型和通过队列在线程之间交换的消息实例。
生产者线程创建消息实例并将其推入队列。消费者将其从队列中取出,处理完成后将调用消息析构函数。
The mechanisms for multithreading always involve passing a callback to be run on a new thread.
错误。在很多情况下,您只需要另一个线程在后台做一些事情或管理一些事情,而不关心状态。此外,除了回调之外,还有其他信令方法(仅举一个例子 conditional variables)。
旁注:可以在任何线程上调用回调,包括您将回调传递到的线程。这完全取决于您如何设计系统。您不必在每次调用回调时都创建一个新线程(尽管这是一种方法)。
Thus, I don't think it's possible for an object to be constructed in one thread and destructed in another, since those would have to be different scopes.
错误。 Shared pointers 允许指向对象的指针在线程中传递,一旦对象的所有引用都被删除,对象就会被销毁。
一个例子是一个网络线程,它构造一个对象来表示从网络接收到的一些消息。然后该线程将该对象放在共享队列中,而其他一些处理线程则处理该消息。处理线程完成后,它可以破坏对象并释放资源用于其他事情。
使用 C++ RAII,当对象超出范围时将调用 dtor。多线程机制总是涉及将回调传递给新线程上的运行。因此,我认为一个对象不可能在一个线程中构造并在另一个线程中被破坏,因为它们必须是不同的范围。
我说得对吗?或者在某些情况下可以在不同线程中调用对象 ctor 和 dtor?
Thus, I don't think it's possible for an object to be constructed in one thread and destructed in another, since those would have to be different scopes.
Am I right about this?
没有。这些函数可以完全独立于任何线程调用。
Or are there some cases where an objects ctor and dtor can be called in different threads?
当然有这种情况(只是日常面包和黄油)。考虑一个简单的生产者/消费者模型和通过队列在线程之间交换的消息实例。
生产者线程创建消息实例并将其推入队列。消费者将其从队列中取出,处理完成后将调用消息析构函数。
The mechanisms for multithreading always involve passing a callback to be run on a new thread.
错误。在很多情况下,您只需要另一个线程在后台做一些事情或管理一些事情,而不关心状态。此外,除了回调之外,还有其他信令方法(仅举一个例子 conditional variables)。
旁注:可以在任何线程上调用回调,包括您将回调传递到的线程。这完全取决于您如何设计系统。您不必在每次调用回调时都创建一个新线程(尽管这是一种方法)。
Thus, I don't think it's possible for an object to be constructed in one thread and destructed in another, since those would have to be different scopes.
错误。 Shared pointers 允许指向对象的指针在线程中传递,一旦对象的所有引用都被删除,对象就会被销毁。
一个例子是一个网络线程,它构造一个对象来表示从网络接收到的一些消息。然后该线程将该对象放在共享队列中,而其他一些处理线程则处理该消息。处理线程完成后,它可以破坏对象并释放资源用于其他事情。