【问题标题】:pthread_singal awakes more than one thread on a multiprocessor systempthread_singal 在多处理器系统上唤醒多个线程
【发布时间】:2011-02-17 10:49:35
【问题描述】:

这是 pthread_cond_wait 手册页的摘录 当条件变量在不同的处理器上同时发出信号时,某些实现,尤其是在多处理器上,有时可能会导致多个线程被唤醒。

一般来说,只要条件等待 返回,线程必须重新评估 谓词与 条件等待判断是否 可以安全进行,应该再等等, 或者应该声明一个超时。我的 问题:这里是什么意思 谓词?这是否意味着我需要 再创建一个变量 中提供的条件变量 pthread_cond_wait 还是指的是同一个变量 已提供在 pthread_cond_wait

【问题讨论】:

    标签: pthreads


    【解决方案1】:

    是的,您需要像 int done_flag; 这样的附加变量才能像这样使用:

    pthread_mutex_lock(&mutex);
    while (!done_flag) pthread_cond_wait(&cond, &mutex);
    /* do something that needs the lock held */
    pthread_mutex_unlock(&mutex);
    /* do some other stuff that doesn't need the lock held */
    

    当然,它通常可能不是一个标志,而是一个计数,或者其他类型的变量,需要测试更复杂的条件。

    【讨论】:

      【解决方案2】:

      这可能很有用。您可以使用 pthread_kill 唤醒特定线程。

      sigset_t _fSigMask; // global sigmask
      

      我们在创建线程之前执行此操作。线程从创建它们的线程继承掩码。我们使用 SIGUSR1 给我们的线程发信号。其他信号可用。

      sigemptyset(&_fSigMask);
      sigaddset(&_fSigMask, SIGUSR1);
      sigaddset(&_fSigMask, SIGSEGV);
      

      然后休眠一个线程

      int nSig;
      sigwait(&fSigMask, &nSig);
      

      然后唤醒线程,YourThread。

      pthread_kill(YourThread, SIGUSR1);
      

      顺便说一句,在我们的测试过程中,以这种方式休眠和唤醒我们的线程比使用条件变量快大约 40 倍。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-29
        • 1970-01-01
        • 1970-01-01
        • 2015-09-16
        • 2013-04-13
        • 2014-08-17
        • 2018-10-13
        • 1970-01-01
        相关资源
        最近更新 更多