首页 > 解决方案 > 使用 while()+sleep() 代替信号量或互斥量?

问题描述

我正在使用线程,有时需要在等待另一个线程完成时暂停一个线程。我有时会使用信号量来阻止另一个线程中的函数在完成之前返回(比如等待设备的相机关闭)。问题是,有时在主线程上调用一个函数,它会锁定应用程序直到它返回。在这种情况下,我可以使用调用 sleep() 的 while 循环来阻止“旋转的沙滩球”向用户显示。有没有更好的解决方案可以防止沙滩球?

标签: javaandroidcmultithreadingmacos

解决方案


我不知道 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
    }
}

推荐阅读