У меня есть объект C ++, который создает поток для чтения из блокирующего сокета UDP:
mRunning.store(true);
while (mRunning.load(boost::memory_order_consume)) {
...
int size = recvfrom(mSocket, buf, kTextBufSize , 0,
(struct sockaddr *) &packet->mReplyAddr.mSockAddr, (socklen_t*)&packet->mReplyAddr.mSockAddrLen);
if (size > 0) {
//do stuff
}
}
return 0;
(mRunning - это импульс :: атомный)
Деструктор объекта вызывается из другого потока и делает это:
mRunning.store(false);
#ifdef WIN32
if (mSocket != -1) closesocket(mSocket);
#else
if (mSocket != -1) close(mSocket);
#endif
pthread_join(mThread, NULL);
Кажется, это работает, но один из моих коллег предположил, что может возникнуть проблема, если recv прерывается во время чтения чего-либо. Эта тема безопасна? Как правильно закрыть блокирующий UDP-сокет? (Должен быть кроссплатформенным OSX / Linux / Windows)