【问题标题】:Select behavior选择行为
【发布时间】:2010-07-13 20:57:25
【问题描述】:

这可能是一个简单的问题,但我找不到明确的答案。我在 c 代码中有多个线程,其中一个使用 select 等待 n 秒。我的问题是它会阻塞整个进程 n 秒(如 usleep)还是 select 只阻塞调用线程(更像是 nanosleep)。 感谢您的回答。

【问题讨论】:

  • 睡眠不会阻塞整个过程,或者至少在我的经验中不会。
  • 我认为确实如此......这是来自 usleep 的手册页“描述 usleep() 函数将调用进程的执行暂停(至少)usec 微秒。”而如果你看一下 nanosleep 的手册页,它会清楚地提到它阻塞了调用线程
  • 你是措辞的受害者。所有的睡眠/阻塞函数都会阻塞当前线程。没有任何函数能够让多线程的整个进程进入睡眠状态。
  • @Dummy ..是的,在昨天运行了测试代码之后,我现在确实意识到了这一点。即使是手册页有时也会产生误导。无论如何,感谢大家为我解决问题

标签: c linux select-function


【解决方案1】:

我见过几个实现,其中一个线程在 select 上阻塞,而其他线程继续处理 - 所以,是的,它只阻塞正在运行的线程。

(抱歉没有提供参考资料)

【讨论】:

  • 谢谢.. 是的,我认为应该是这样,但我就是想不起任何这样的用法。
【解决方案2】:

POSIX spec for select 只在一处特别提到了“线程”,其中提到了由pselect() 恢复调用线程 的信号掩码。

与其他答案一样,我的经验也表明答案是肯定的,它只会阻塞调用线程。

【讨论】:

    【解决方案3】:

    是的。一个草率但仍然相当确凿的测试。

    #include <iostream>
    #include <pthread.h>
    #include <sys/time.h>
    
    using namespace std;
    
    pthread_mutex_t cout_mutex = PTHREAD_MUTEX_INITIALIZER;
    
    void *task1(void *X)
    {
       timeval t = {0, 100000};
    
        for (int i = 0; i < 10; ++i)
        {
            pthread_mutex_lock(&cout_mutex);
            cout << "Thread A going to sleep" << endl;
            pthread_mutex_unlock(&cout_mutex);
    
            select(0, NULL, NULL, NULL, &t);
    
            pthread_mutex_lock(&cout_mutex);
            cout << "Thread A awake" << endl;
            pthread_mutex_unlock(&cout_mutex);
        }
    
       return (NULL);
    }
    
    
    void *task2(void *X)
    {
       pthread_mutex_lock(&cout_mutex);
       cout << "Thread B down for the long sleep" << endl;
       pthread_mutex_unlock(&cout_mutex);
    
       timeval t = {5, 0};
       select(0, NULL, NULL, NULL, &t);
    
       pthread_mutex_lock(&cout_mutex);
       cout << "Thread B glad to be awake" << endl;
       pthread_mutex_unlock(&cout_mutex);
    
       return (NULL);
    }
    
    
    int main(int argc, char *argv[])
    {
      pthread_t ThreadA,ThreadB;
    
      pthread_create(&ThreadA,NULL,task1,NULL);
      pthread_create(&ThreadB,NULL,task2,NULL);
    
      pthread_join(ThreadA,NULL);
      pthread_join(ThreadB,NULL);
    
      return (0);
    }  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 2020-08-07
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多