2011-02-07 52 views
0

timer_create()関数が呼び出されたときにスレッドIDを取得する方法を調べています。 timer_create()が呼び出されるたびに、新しいスレッド(メインプロセスの子スレッド)が作成されることがわかりました。 ps -eLでgrepを確認しました。timer_create()の呼び出し時の新しいスレッド

timer_createを使用する私のプログラムの中でps -eLと同じTID(子スレッドID)を表示する必要があります。 以下のコードから:私のプログラムの中でTID 18018を取得するにはどうすればよいですか?

すべての投稿を調査したところ、通知機能を呼び出してtimer_create()を呼び出さないと、新しいスレッドが作成されたという記述がありました。

ご協力いただきありがとうございます。

コード:

SLGTRACER_DEFINE(testMain, "testMain"); 


timer_t audit_timer1; 

void timeoutHandler(sigval_t info) 
{ 
    slgInfo(testMain, "timeoutHandler invoked"); 

    slgInfo(testMain, "gettid() = %lu TESTMAIN", syscall(SYS_gettid)); 
    slgInfo(testMain, "getpid() = %d TESTMAIN", getpid()); 

} 

int main(void) 
{ 
    slgInfo(testMain, "testMain Invoked"); 


    struct sigevent evp1; 
    evp1.sigev_notify = SIGEV_THREAD; 
    evp1.sigev_value.sival_ptr = &audit_timer1; 
    evp1.sigev_notify_function = timeoutHandler; 
    evp1.sigev_notify_attributes = NULL; 

    const int ERROR_BUFFER_SIZE = 50; 


     slgInfo(testMain, "Before FIRST timer_create"); 
     sleep(30); 


    // Create timer thread 
    if (timer_create(CLOCK_REALTIME, &evp1, &audit_timer1) != 0) 
    { 
     // Character buffer for storing error message. 
     char  errBuff[ERROR_BUFFER_SIZE]; 

     memset(errBuff, 0, ERROR_BUFFER_SIZE); 

     slgError(testMain, 
        "timer_start create failed. Error = %s", 
        strerror_r(errno, errBuff, ERROR_BUFFER_SIZE)); 

     timer_delete(audit_timer1); 
     bzero(&audit_timer1, sizeof(audit_timer1)); 
    } 


     slgInfo(testMain, "After FIRST timer_create"); 
     sleep(30); 

    return 0; 

} 

 

bash-3.1# ps -eL|grep testM 
16651 16651 pts/0 00:00:00 testMain 
16651 18018 pts/0 00:00:00 testMain 
child thread with ID created by timer_create() = 18018 

答えて

0

タイムアウトハンドラが指定されていない呼び出される前にスレッドがさえ存在するかどうか。確かに、適合する実装は、タイマが終了するまでスレッドの作成を遅らせる可能性がある。 pidのように見える数値スレッドIDの存在も実装の詳細です。使用しないでください。

達成しようとしていることを説明できますか?確かに良い方法があります...

+0

複数のテストの後、timer_create()が呼び出されたときに子スレッドが作成されていることがわかりました。私は自分のプログラムでそのスレッドIDを取得しようとしています。そのスレッドIDを使用して、そのスレッドのスケジュールオプションを設定します。 – LinuxNewbie

+0

はい、timer_create()が呼び出された後、timeoutHandler()が呼び出される前にスレッドが存在します。 – LinuxNewbie

+2

@LinuxNewbieこれが必要な場合は、struct sigeventのsigev_notify_attributesメンバーとしてpthread_attr_tを指定することができます。こうすることで、たとえばpthread_attr_setschedpolicyなどで設定された属性でスレッドを初期化できます。この新しい情報で質問を更新/変更する必要があります。 – nos

関連する問題