我有两个线程,一个线程运行一个循环来检查多个套接字上是否有等待接收的数据,另一个线程试图向套接字列表中添加一个套接字或删除一个套接字。
守则如下:
线程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上等待一个循环,但是在安卓上它可以是10+seconds。
因此,我假设pthread_unlock_mutex不会唤醒Android上的其他等待线程。我可以在循环的开头添加usleep(0)来解决这个问题,甚至手册页 of usleep也说usleep(0)没有效果。
但是如果我添加usleep(0),那么每个循环都会有线程切换,我认为这对移动设备的性能没有好处。
那么,在调用pthread_unlock_mutex时释放CPU的替代方法是什么,而不考虑性能问题,换句话说,只有在线程等待锁时才释放CPU?
发布于 2013-10-30 12:55:32
不如:
线程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);
}线程2:
void AddSocket(Socket* socket)
{
AutoLock addLock(_addLock);
AutoLock socLock(_socketsLock);
_sockets.push_back(socket);
}https://stackoverflow.com/questions/19679615
复制相似问题