我有两个线程,一个线程运行一个循环来检查是否有多个套接字等待接收到的数据,另一个线程尝试将一个套接字添加到套接字列表或删除一个。
代码如下:
线程 1:
while (!stop)
{
// usleep(0)
AutoLock lock(_socketsLock); // AutoLock will call pthread_lock_mutex/pthread_unlock_mutex.
Socket* activeSockets = waitOnSockets(_sockets, 50); // Wait 50ms for data on the socket list.
// Handle the data from socket.
}
线程 2:
void AddSocket(Socket* socket)
{
AutoLock lock(_socketsLock);
_sockets.push_back(socket);
}
问题是AddSocket
接缝在系统上长时间无法锁定Android
,我已经在 Mac 上运行了应用程序,接缝 AddSocket 最多等待一个循环,但在 android 上可能是 10+ 秒。
所以我假设 pthread_unlock_mutex 不会唤醒其他等待线程Android
。我可以usleep(0)
在循环的开头添加来解决这个问题,即使man page of usleep
sayusleep(0)
也没有效果。
但是如果我添加usleep(0)
,每个循环都会有线程切换,我认为这对移动设备性能不利。
那么在调用时释放 CPUpthread_unlock_mutex
并且不会出现性能问题的替代方法是什么,换句话说,只有在有线程等待锁定时才释放 CPU?