0

我有两个线程,一个线程运行一个循环来检查是否有多个套接字等待接收到的数据,另一个线程尝试将一个套接字添加到套接字列表或删除一个。

代码如下:

线程 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?

4

1 回答 1

1

怎么样:

线程 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);
}
于 2013-10-30T12:55:32.263 回答