首页 > 解决方案 > 由类析构函数完成的同步

问题描述

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

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

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

return 0;
}

下面有一个进行进程间通信的类,如下所示:

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 

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

标签: c++multithreadingoopthread-synchronization

解决方案


RAII通常是一个非常有用的习惯用法,它使您的代码异常安全,并降低了在进一步修改过程中出现错误的风险。

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

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


推荐阅读