由类析构函数完成的同步

时间:2018-05-08 07:01:04

标签: c++ multithreading oop thread-synchronization

我对多线程有疑问。我有一个非常大的项目,现在我正在编写一些exe客户端来使用所有代码。它涉及多线程和进程间通信。我有主要的东西,看起来像这样:

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 

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

2 个答案:

答案 0 :(得分:2)

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

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

关于std::future::wait的异常安全性 - 在valid() == false之前的wait()时,它的行为是未定义的,因此您应该先在析构函数中调用它之前检查它。

答案 1 :(得分:0)

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

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