我有两个线程,一个线程运行一个循环来检查是否有多个套接字等待接收到的数据,另一个线程尝试将一个套接字添加到套接字列表或删除一个。
代码如下:
线程 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 usleepsayusleep(0)也没有效果。
但是如果我添加usleep(0),每个循环都会有线程切换,我认为这对移动设备性能不利。
那么在调用时释放 CPUpthread_unlock_mutex并且不会出现性能问题的替代方法是什么,换句话说,只有在有线程等待锁定时才释放 CPU?