2012-08-11 7 views
7

linux(Centos)でpthreadを使ってプログラミングしていますか?私は何かを待つために短い時間スリープスレッドにしたいです。私はsleep()、nanosleep()、またはusleep()を使用しようとしています。スリープ関数はすべてのスレッドをスリープさせるのか、それともそれを呼び出すスレッドだけをスリープさせるのか?どんなアドバイスや参考資料もありがたいです。スリープ機能は、すべてのスレッドまたはそれを呼び出すスレッドだけをスリープさせますか?

void *start_routine() { 
    /* I just call sleep functions here */ 
    sleep (1); /* sleep all threads or just the one who call it? 
        what about nanosleep(), usleep(), actually I 
        want the threads who call sleep function can 
        sleep with micro-seconds or mili-seconds. 
       */ 
    ... 
} 

int main (int argc, char **argv) { 
    /* I just create threads here */ 
    pthread_create (... ...); 
    ... 
    return 0; 
} 

私のテストプログラム:

#define _GNU_SOURCE 
#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <sched.h> 
#include <unistd.h> 

void *start_routine (void *j) { 

    unsigned long sum; 
    int i; 
    int jj; 
    jj = (int)j; 
    do { 
     sum = 1; 
     for (i=0; i<10000000; i++) { 
      sum = sum * (sum+i); 
     } 
     if (jj == 0) { 
      printf ("\033[22;33m[jj%d.%ld]\t", jj, sum); 
      sleep(1);   
     } 
     else { 
      printf ("\033[22;34m[jj%d.%ld]\t", jj, sum); 
     } 

    }while (1); 

    pthread_exit((void *)0); 
} 
int main(int argc, char *argv[]) 
{ 
    cpu_set_t cpuset; 
    pthread_t thread[2]; 
    int i; 
    i = 0; 
    CPU_ZERO(&cpuset); 
    CPU_SET(i, &cpuset); 

    pthread_create (&thread[0], NULL, start_routine, (void *)i); 
    pthread_setaffinity_np(thread[0], sizeof(cpu_set_t), &cpuset); 
    i = 1; 
    CPU_ZERO(&cpuset); 
    CPU_SET(i, &cpuset); 
    pthread_create (&thread[1], NULL, start_routine, (void *)i); 
    pthread_setaffinity_np(thread[1], sizeof(cpu_set_t), &cpuset); 
    pthread_exit (NULL); 
} 
+0

発信者 – bestsss

+1

@Kiril、質問の履歴を確認してください。それは答えのための単一のライナーだ – bestsss

+0

私は "警告"ではなく "仕事"を意味した。 @bestsss - 何を確認するのですか?私はこの質問について何も言っていない、私もアップ - 投票した。 –

答えて

9

The standard呪文を:

linux 1だけで明らかようです

....まで、スリープ()関数が実行から を中断する呼び出し元のスレッドを引き起こすもの:

sleep()呼び出しスレッドをスリープさせる〜まで

しかし、それ以外の場合は、誤った参照がいくつかあります。 linux.die.netがsleepの状態になっていると、のプロセスは、を待ちます。

+3

しかし、sleep()関数はメインスレッドをスリープさせるようです。 –

+1

@NickDong **呼び出しスレッド**をスリープさせます。 – cnicutar

+0

おかげさまでもう一度試してみます。 –

3

関数を呼び出すだけのスレッド。

+0

それをテストしたことがありますか?私のテストプログラムでは、メインスレッドをスリープさせるようです。 –

+0

はい、私はそれをテストしました。私は関数のドキュメントも読んだ。 – jalf

+0

@jalfは100%正しいです。 Sleep()コールがメインスレッドをスリープ状態にしている場合、メインスレッドは直接スリープ状態を呼び出しているか、スリープ後にスリープ状態のスレッドが供給している他の信号を待っています。 –

関連する問題