我有一个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 是一个 boost::atomic 类型的对象) 该对象的析构函数会在另一个线程中被调用,并且会执行以下操作:
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)