pthread_unlock_mutex不会唤醒等待线程

时间:2013-10-30 10:23:08

标签: 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(_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?

1 个答案:

答案 0 :(得分: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);
}