2011-12-06 21 views
1

このプログラムは5つのスレッドを作成し、それぞれがこのスレッドの一意の番号を標準出力に出力するTaskCode関数を実行します。スレッドの属性を作成して表示する方法

私の質問は、スレッドの属性を作成して表示する方法です。

+4

ここpthread_attr_getxxxが、他のOSのために失敗した理由について同様の記事を参照してください

ps -Leo cmd, pid, prio, policy 

のようなコマンドを使用して属性のいくつかを確認することができますか –

+0

@DavidSchwartz私は自分の質問を更新しました – EnexoOnoma

+0

私はまだあなたが何について話しているのか分かりません。スタックサイズのようなPOSIXのpthread作成属性を意味しますか? –

答えて

4

pthread_attr_init(3)には、スレッドで使用できる属性を取得する方法を示すサンプルプログラムが含まれています。 APIはpthread_tスレッド識別子を指定することはできませんので、現在のスレッドのみの属性を返すことができることに注意してください:

static void 
    display_pthread_attr(pthread_attr_t *attr, char *prefix) 
    { 
     int s, i; 
     size_t v; 
     void *stkaddr; 
     struct sched_param sp; 

     s = pthread_attr_getdetachstate(attr, &i); 
     if (s != 0) 
      handle_error_en(s, "pthread_attr_getdetachstate"); 
     printf("%sDetach state  = %s\n", prefix, 
       (i == PTHREAD_CREATE_DETACHED) ? "PTHREAD_CREATE_DETACHED" : 
       (i == PTHREAD_CREATE_JOINABLE) ? "PTHREAD_CREATE_JOINABLE" : 
       "???"); 

     s = pthread_attr_getscope(attr, &i); 
     if (s != 0) 
      handle_error_en(s, "pthread_attr_getscope"); 
     printf("%sScope    = %s\n", prefix, 
       (i == PTHREAD_SCOPE_SYSTEM) ? "PTHREAD_SCOPE_SYSTEM" : 
       (i == PTHREAD_SCOPE_PROCESS) ? "PTHREAD_SCOPE_PROCESS" : 
       "???"); 

     s = pthread_attr_getinheritsched(attr, &i); 
     if (s != 0) 
      handle_error_en(s, "pthread_attr_getinheritsched"); 
     printf("%sInherit scheduler = %s\n", prefix, 
       (i == PTHREAD_INHERIT_SCHED) ? "PTHREAD_INHERIT_SCHED" : 
       (i == PTHREAD_EXPLICIT_SCHED) ? "PTHREAD_EXPLICIT_SCHED" : 
       "???"); 

     s = pthread_attr_getschedpolicy(attr, &i); 
     if (s != 0) 
      handle_error_en(s, "pthread_attr_getschedpolicy"); 
     printf("%sScheduling policy = %s\n", prefix, 
       (i == SCHED_OTHER) ? "SCHED_OTHER" : 
       (i == SCHED_FIFO) ? "SCHED_FIFO" : 
       (i == SCHED_RR) ? "SCHED_RR" : 
       "???"); 

     s = pthread_attr_getschedparam(attr, &sp); 
     if (s != 0) 
      handle_error_en(s, "pthread_attr_getschedparam"); 
     printf("%sScheduling priority = %d\n", prefix, sp.sched_priority); 

     s = pthread_attr_getguardsize(attr, &v); 
     if (s != 0) 
      handle_error_en(s, "pthread_attr_getguardsize"); 
     printf("%sGuard size   = %d bytes\n", prefix, v); 

     s = pthread_attr_getstack(attr, &stkaddr, &v); 
     if (s != 0) 
      handle_error_en(s, "pthread_attr_getstack"); 
     printf("%sStack address  = %p\n", prefix, stkaddr); 
     printf("%sStack size   = 0x%x bytes\n", prefix, v); 
    } 
1

pthread_attr_*()機能セットを使用する必要があります。 Thisリンクは良い説明があります。

0

これを行うための唯一確実な方法は、一つを介してpthread_createの間に渡されたSETATTRを格納することです単一ラッパーを使用し、ラッパーに監査/取得のための照会を行います。これは、Linuxカーネル2.6.34バージョンでの私の経験に基づいており、pthread_attr_getxxxx apisは信頼できません。以下は

次attrsに

pthread_attr_setscope = PTHREAD_SCOPE_SYSTEM 
pthread_attr_setinheritsched = PTHREAD_EXPLICIT_SCHED 
pthread_attr_setschedpolicy = SCHED_FIFO 
pthread_attr_setguardsize = 1k; 
pthread_attr_setstacksize = 32K; 

とスレッド機能がpthread_attr_getxxxxを使用して属性を照会し、最も可能性の高いあなたが異なる表示されます内のattrに設定することで、pthreadの作成私の答え

を検証するための簡単なテストであります値。私はschedpolicyと継承されたパラメータの違いを確かに確認しています。

あなたはいつも私はあなたが話しているの?「属性」何

関連する問題