Posixスレッドプログラミングガイド(5)


Posixスレッド仕様にはいくつかの補助関数が分類しにくいが,pthread_を主に含むヘテロ関数と呼ぶ.self()、pthread_equal()とpthread_once()は3つ、もう1つのLinuxThreads非移植性拡張関数pthread_kill_other_threads_np().ここでは、これらの関数の定義と使用について説明します.
このスレッドIDを取得
pthread_t pthread_self(void)
この関数は、スレッドの識別子を返します.
LinuxThreadsでは、各スレッドにpthread_が1つ使用されます.descr構造は、スレッド状態、スレッドIDなどのすべての必要なデータ構造を含み、この関数の実装は、オンラインスタックフレーム内で本スレッドを見つけるpthread_である.descr構造は、p_を返します.tid項.
pthread_tタイプはLinuxThreadsで符号なしロング整数として定義される.
トップに戻る
2つのスレッドが同じスレッドであるかどうかを判断
int pthread_equal(pthread_t thread1, pthread_t thread2)
2つのスレッド記述子が同じスレッドを指しているかどうかを判断します.LinuxThreadsでは,スレッドIDが同じスレッドは必然的に同じスレッドであるため,この関数の実装はthread 1とthread 2が等しいか否かのみを判断する.
トップに戻る
1回のみの操作
int pthread_once(pthread_once_t *once_control, void (*init_routine) (void))
この関数はPTHREAD_の初期値を使用します.ONCE_INITのonce_コントロール変数保証init_routine()関数は、このプロセス実行シーケンスで1回のみ実行されます.
#include <stdio.h>
#include <pthread.h>
pthread_once_t  once=PTHREAD_ONCE_INIT;
void    once_run(void)
{
        printf("once_run in thread %d/n",pthread_self());
}
void * child1(void *arg)
{
        int tid=pthread_self();
        printf("thread %d enter/n",tid);
        pthread_once(&once,once_run);
        printf("thread %d returns/n",tid);
}
void * child2(void *arg)
{
        int tid=pthread_self();
        printf("thread %d enter/n",tid);
        pthread_once(&once,once_run);
        printf("thread %d returns/n",tid);
}
int main(void)
{
        int tid1,tid2;
        printf("hello/n");
        pthread_create(&tid1,NULL,child1,NULL);
        pthread_create(&tid2,NULL,child2,NULL);
        sleep(10);
        printf("main thread exit/n");
        return 0;
}

once_run()関数は1回のみ実行され、pthread_にもかかわらず、どのスレッドで実行されるかは不定である.once(&once,once_run)は2つのスレッドに表示されます.
LinuxThreadsは反発ロックと条件変数を使用してpthread_によって保証される.once()で指定した関数は1回のみ実行され、once_コントロールは実行したかどうかを表します.once_コントロールの初期値はPTHREADではありませんONCE_INIT(LinuxThreads定義0)、pthread_once()の行為は正常ではありません.LinuxThreadsでは、実際の「ワンタイム関数」の実行状態は、NEVER(0)、IN_の3種類あります.PROGRESS(1)、DONE(2)、once初期値が1に設定されている場合、すべてのpthread_once()は、いずれかの励起が「1回実行された」信号を待つ必要があるため、すべてのpthread_once()は永遠の待機に陥る.2に設定すると、すべてのpthread_が実行されたことを示します.once()はすぐに0を返します.
トップに戻る
pthread_kill_other_threads_np()
void pthread_kill_other_threads_np(void)
この関数はLinuxThreadsが実現できないPOSIXの約束に対して行った拡張である.POSIXでは、プロセスのあるスレッドがexec*システム呼び出しを実行してプロセススペースに別のプログラムをロードする場合、現在のプロセスのすべてのスレッドが終了する必要があります.LinuxThreadsの限界のため、このメカニズムはexecで実現できないため、スレッドがexecを実行する前に他のすべてのスレッドを手動で終了する必要がある.pthread_kill_other_threads_np()の役割はこれです.
注意すべきはpthread_kill_other_threads_np()はpthread_を通過しなかったcancel()はスレッドを終了させるのではなく、直接管理スレッドに「プロセス終了」信号を送信し、Cancel動作を経ずに他のすべてのスレッドを終了させ、もちろん終了コールバック関数も実行されません.LinuxThreadsの実験結果はドキュメントの説明と同じであるが,コード実装では_pthread_sig_cancel信号はkillスレッドに来て、効果とpthread_を実行するべきですcancel()は同じで、その原因はまだ不明です.