【问题标题】:Use while()+sleep() instead of semaphore or mutex?使用 while()+sleep() 代替信号量或互斥量?
【发布时间】:2020-02-22 21:53:54
【问题描述】:

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

【问题讨论】:

  • 你可以看看 spinlocks.. 它可能对你有帮助
  • 睡眠的问题是你几乎总是睡得比必要的时间长,或者你的睡眠时间太短以至于你真的只是在等待,这很浪费 CPU。
  • “锁定应用程序”是什么意思? GUI 不响应消息?
  • Martin,是的,因为主线程被阻塞,所以没有响应用户输入。在 Mac 上,这会显示沙滩球光标,而在 Android 上,您会收到 Logcat 警告,表明主线程已被阻止。

标签: java android c multithreading macos


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-08-30
    • 2017-08-24
    • 2012-09-01
    • 2011-04-20
    • 2011-01-05
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多