我有两个线程,一个线程运行一个循环来检查是否有多个套接字上等待接收的数据,另一个线程尝试将套接字添加到套接字列表或删除一个。
代码如下:
主题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)
来解决此问题,即使usleep
usleep(0)
usleep(0)
说pthread_unlock_mutex
也无效。
但如果我添加{{1}},每个循环都会有线程切换,我认为这对移动设备的性能不利。
那么在调用{{1}}时释放CPU的替代方法是什么,并且没有案例性能问题,换句话说只有当线程等待锁定时才释放CPU?
答案 0 :(得分:1)
怎么样:
while (!stop)
{
AutoLock addLock(_addLock);
AutoLock socLock(_socketsLock);
// Release the addLock here.
// This gives thread 2 an opportunity to get the first lock while this
// thread is waiting on the socket.
AutoRelease addRel(addLock);
// When this thread finishes it will be forces to sleep if there are
// any waiting AddSocket requests otherwise it will continue as normal.
Socket* activeSockets = waitOnSockets(_sockets, 50);
}
void AddSocket(Socket* socket)
{
AutoLock addLock(_addLock);
AutoLock socLock(_socketsLock);
_sockets.push_back(socket);
}