【发布时间】:2011-06-10 11:03:41
【问题描述】:
我有一个 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)
【问题讨论】: