java - 使用 while()+sleep() 代替信号量或互斥量?
问题描述
我正在使用线程,有时需要在等待另一个线程完成时暂停一个线程。我有时会使用信号量来阻止另一个线程中的函数在完成之前返回(比如等待设备的相机关闭)。问题是,有时在主线程上调用一个函数,它会锁定应用程序直到它返回。在这种情况下,我可以使用调用 sleep() 的 while 循环来阻止“旋转的沙滩球”向用户显示。有没有更好的解决方案可以防止沙滩球?
解决方案
我不知道 posix 线程是否可以在 Android 上使用,如果可以,请查看pthread_cond_timedwait:
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void *timer_handler(void *handler)
{
struct timespec end;
clock_gettime(CLOCK_REALTIME, &end);
end.tv_sec += 5;
int stop = 1;
pthread_mutex_lock(&mutex)
int error = pthread_cond_timedwait(&cond, &mutex, &end); // Wait 5 seconds
if (error == ETIMEDOUT)
{
stop = 0;
}
else if (error != 0)
{
perror("pthread_cond_timedwait");
exit(EXIT_FAILURE);
}
pthread_mutex_unlock(&mutex)
if (stop == 0)
{
// Do your stuff here
}
}
推荐阅读
- java - 验证意图是否采取有效活动
- django - Django 上传的图片在页面上太大了
- r - dplyr mutate 在列中找到 n 个下一个值的最大值
- java - Apache Curator DistributedQueue 的 lockPath 是如何工作的?
- xml - 如何使用 QDomDocument 更改 svg 属性?
- python - 如何在 python 上调整时间序列数据的大小
- node.js - 猫鼬中 ref 集合的默认值
- android - 无法在 BottomAppBar 中获得高度
- firebase - 如何将 SMTP 与 Firebase 连接?
- android - Ionic 在带有图标的 android 设备上安装应用程序