Android pthread_unlock_mutex不';不要醒来等待线程
我有两个线程,一个线程运行一个循环来检查多个套接字上是否有等待接收到的数据,另一个线程尝试将一个套接字添加到套接字列表或删除一个 代码如下: 线程1:Android pthread_unlock_mutex不';不要醒来等待线程,android,c++,multithreading,posix,scheduler,Android,C++,Multithreading,Posix,Scheduler,我有两个线程,一个线程运行一个循环来检查多个套接字上是否有等待接收到的数据,另一个线程尝试将一个套接字添加到套接字列表或删除一个 代码如下: 线程1: while (!stop) { // usleep(0) AutoLock lock(_socketsLock); // AutoLock will call pthread_lock_mutex/pthread_unlock_mutex. Socket* activeSockets = waitOnSockets(_so
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.
}
void AddSocket(Socket* socket)
{
AutoLock lock(_socketsLock);
_sockets.push_back(socket);
}
线程2:
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.
}
void AddSocket(Socket* socket)
{
AutoLock lock(_socketsLock);
_sockets.push_back(socket);
}
问题是AddSocket
seams在Android
系统上很长时间都无法获得锁,我已经在Mac上运行了这个应用程序,seams-AddSocket最多只能等待一个循环,但在Android上可能需要10秒以上
所以我假设pthread_unlock_mutex不会唤醒Android
上的其他等待线程。我可以在循环的开头添加usleep(0)
来解决这个问题,即使usleep
说usleep(0)
也没有效果
但是如果我添加usleep(0)
,每个循环都会有线程切换,我认为这对移动设备的性能不好
那么,在调用pthread\u unlock\u mutex时释放CPU的另一种方法是什么呢?如果不考虑性能问题,换句话说,只有在有线程等待锁定时才释放CPU?怎么样:
线程1:
线程2:
只是一个想法。如果不深入讨论这个问题,我会觉得它闻起来像是一种比赛状态。仅仅因为线程现在可以锁定并不意味着它会醒来。线程仍然必须由操作系统调度。我不确定你的硬件有多少核。但是,如果它只有一个线程,为什么当前线程要进入睡眠状态,让另一个线程运行呢?这就是
usleep()
起作用的原因。它有效地将此线程置于睡眠状态,以便操作系统找到另一个可以运行的可用线程。@LokiAstari,实际上,当解锁“return.\u pthread.\u tpp.\u change.\u priority(oldprio,-1);”时,glibc实现将降低当前线程优先级。@ZijingWu:不会更改我的原始注释。