Tengo un objeto de C++ que crea un hilo para leer de un socket UDP bloqueo:manera adecuada para cerrar un socket UDP bloqueo
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 es un impulso :: atómica) destructor del objeto se llama desde otro hilo y hace esto:
mRunning.store(false);
#ifdef WIN32
if (mSocket != -1) closesocket(mSocket);
#else
if (mSocket != -1) close(mSocket);
#endif
pthread_join(mThread, NULL);
esto parece funcionar, pero uno de mis colegas sugirió que podría ser un problema si recv se interrumpe en medio de la lectura de algo. ¿Este hilo es seguro? ¿Cuál es la forma correcta de cerrar un socket UDP de bloqueo? (Debe ser multiplataforma OSX/Linux/Windows)
No son enchufes de refuerzo, son enchufes de posix. Boost es solo para asegurar que el cambio de mRunning bool sea atómico. Lamento haber sido destrozado cuando lo pegué y no me di cuenta. –