我有一個創建一個線程阻塞UDP套接字讀取一個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 ::原子) 對象的析構函數被調用從另一個線程,並做到這一點:
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)
他們不是增強套接字,他們是posix套接字。 Boost只是爲了確保改變mRunning布爾是原子的。對不起,當我粘貼它,我沒有注意到。 – 2011-06-10 12:55:37