class 个析构函数完成的同步

Synchronization done by class destructors

我有关于多线程的问题。我有一个相当大的项目,现在我正在编写一些 exe 客户端来使用所有这些代码。它涉及多线程和进程间通信。我有 main 看起来像这样:

int main(int argc, char** argv)
{
std::unique_ptr<CommunicationWrapper> wrapper;

wrapper = std::make_unique<CommunicationWrapper>(argv[1]);
wrapper->run();

return 0;
}

下面有一个class正在进行进程间通信,看起来像这样:

CommunicationEngine::CommunicationEngine()
 : m_processingLoop(std::async(std::launch::async, [this]() { processingLoop(); }))
{}

CommunicationEngine::~CommunicationEngine()
{
   m_processingLoop.wait();
}

//some long function that do a lot of stuff based on messages from anothre process
void CommunicationEngine::processingLoop() const 

这段代码没有问题,但我想知道在析构函数调用时进行同步(等待)是否被认为是好的做法和好的设计?这种方法可能存在哪些缺陷?

首先,您在提供的代码中不需要任何 unique_ptr。只是 CommunicationWrapper(argv[1]).run() 就行了。

其次,我看不出你在做什么总的来说。在析构函数中等待线程完成就可以了。但是,您应该意识到您的应用程序在线程终止之前不会退出,因此如果其中存在错误,您的应用程序将永远不会退出。有时人们更喜欢定时等待,而不是在一定时间后退出。

RAII 总的来说是一个非常有用的习惯用法,它使您的代码异常安全,并降低在进一步修改期间出现错误的风险。

您应该做的主要事情 - 是确保您的析构函数不会抛出。

关于 std::future::wait 的异常安全性 - 当 valid() == falsewait() 之前,它的行为是未定义的,所以你应该在 desctructor 中调用它之前检查它。