选择行为

时间:2010-07-13 20:57:25

标签: c linux select-function

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

POSIX spec for select只在一个地方提到了“线程”,它讨论了通过pselect()恢复调用线程的信号掩码。

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

答案 2 :(得分:1)

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

#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);
}