Синхронизация выполняется деструкторами классов - PullRequest
0 голосов
/ 08 мая 2018

У меня вопрос по многопоточности. У меня довольно большой проект, и сейчас я пишу некоторый 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 голосов
/ 08 мая 2018

RAII в целом - очень полезная идиома, она делает ваш код безопасным от исключений и снижает риск появления ошибок при дальнейшей модификации.

Главное, что вы должны сделать - это убедиться, что ваш деструктор не будет бросать.

Относительно безопасности исключений std::future::wait - это поведение не определено, когда valid() == false до wait(), поэтому вы должны проверить это перед вызовом в десктрукторе.

0 голосов
/ 08 мая 2018

Прежде всего, вам не нужно никаких unique_ptr в предоставленном коде. Просто CommunicationWrapper(argv[1]).run() будет делать.

Во-вторых, я не вижу проблем в том, что вы делаете в целом . Можно дождаться завершения потока в деструкторе. Однако вы должны понимать, что ваше приложение не завершит работу, пока поток не завершится, поэтому, если в нем есть ошибка, ваше приложение никогда не завершится. Иногда люди предпочитают делать время ожидания и выходить через определенное время.

...