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() == false
在 wait()
之前,它的行为是未定义的,所以你应该在 desctructor 中调用它之前检查它。
我有关于多线程的问题。我有一个相当大的项目,现在我正在编写一些 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() == false
在 wait()
之前,它的行为是未定义的,所以你应该在 desctructor 中调用它之前检查它。