1

おそらく簡単な質問かもしれませんが、明確な答えを見つけることができませんでした。C コードに複数のスレッドがあり、そのうちの 1 つは select を使用して n 秒間待機します。私が持っている質問は、プロセス全体を n 秒間ブロックするか (usleep のように)、呼び出しスレッドのみを選択してブロックするか (nanosleep のように) です。答えてくれてありがとう。

4

3 に答える 3

4

他のスレッドが処理を続行している間、1つのスレッドがブロックしている実装をいくつか見てきましたselect。つまり、実行中のスレッドのみをブロックします。

(参照を持ってこないことをお詫びします)

于 2010-07-13T21:03:39.643 に答える
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);
}  
于 2010-07-14T04:11:01.647 に答える
1

POSIX 仕様でselectは、1 か所だけで「スレッド」について明確に言及されており、そこでは、呼び出しスレッドのシグナル マスクをpselect().

他の回答と同様に、私の経験では、答えはイエスであり、呼び出し元のスレッドをブロックするだけです。

于 2010-07-14T00:00:41.450 に答える