我对多线程有疑问。我有一个非常大的项目,现在我正在编写一些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
这段代码没有问题,但是我想知道在析构函数的调用上进行同步(等待)是否被认为是良好的做法和良好的设计?这种方法有哪些可能的陷阱?
答案 0 :(得分:2)
RAII通常是一个非常有用的习惯用法,它会使您的代码异常安全,并降低在进一步修改过程中出现错误的风险。
你应该做的主要是确保你的析构函数不会抛出。
关于std::future::wait
的异常安全性 - 在valid() == false
之前的wait()
时,它的行为是未定义的,因此您应该先在析构函数中调用它之前检查它。
答案 1 :(得分:0)
首先,您在提供的代码中不需要任何unique_ptr
。只是
CommunicationWrapper(argv[1]).run()
会这样做。
其次,我认为你在做什么一般没问题。可以等待线程在析构函数中完成。但是,您应该意识到在线程终止之前您的应用程序不会退出,因此如果它中存在错误,您的应用程序将永远不会退出。有时人们喜欢做定时等待,而不是在一段时间后退出。