我有一个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;
Run Code Online (Sandbox Code Playgroud)
(mRunning是一个boost :: atomic)从另一个线程调用该对象的析构函数并执行此操作:
mRunning.store(false);
#ifdef WIN32
if (mSocket != -1) closesocket(mSocket);
#else
if (mSocket != -1) close(mSocket);
#endif
pthread_join(mThread, NULL);
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我的一位同事建议,如果recv在阅读过程中被中断,可能会出现问题.这个线程安全吗?关闭阻塞UDP套接字的正确方法是什么?(需要跨平台的OSX/Linux/Windows)