首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pthread_unlock_mutex不会唤醒等待线程

pthread_unlock_mutex不会唤醒等待线程
EN

Stack Overflow用户
提问于 2013-10-30 10:23:07
回答 1查看 167关注 0票数 0

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

守则如下:

线程1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-30 12:55:32

不如:

线程1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
void AddSocket(Socket* socket)
{
     AutoLock addLock(_addLock);
     AutoLock socLock(_socketsLock);

     _sockets.push_back(socket);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19679615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档