gpt4 book ai didi

android - pthread_unlock_mutex 不唤醒等待线程

转载 作者:行者123 更新时间:2023-11-28 07:19:46 25 4
gpt4 key购买 nike

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

代码如下:

线程 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 seams 在 Android 系统上长时间无法获取锁,我在 Mac 上运行应用程序, seams AddSocket 最多等待一个循环,但在 Android 上它可以超过 10 秒。

所以我假设 pthread_unlock_mutex 不会唤醒 Android 上的其他等待线程。我可以在循环的开头添加 usleep(0) 来解决这个问题,即使是 man page usleepusleep(0) 将无效。

但是如果我添加 usleep(0),每次循环都会有线程切换,我认为这对移动设备性能不利。

那么在调用 pthread_unlock_mutex 时释放 CPU 的替代方法是什么,并且不会出现性能问题,换句话说,只有在有线程等待锁时才释放 CPU?

最佳答案

怎么样:

线程 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);
}

关于android - pthread_unlock_mutex 不唤醒等待线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19679615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com