pthread_cleanup_pop() - クリーンアップ・ハンドラーの除去

標準

標準/拡張機能 C/C++ 依存項目

POSIX.4a
Single UNIX Specification、バージョン 3

両方

POSIX(ON)

形式

#define _OPEN_THREADS
#include <pthread.h>

void pthread_cleanup_pop(int execute);

機能説明

呼び出しスレッドのクリーンアップ・スタックの最上部から、最後に実行された pthread_cleanup_push() ステートメント内に 指定されている routine を除去します。

execute パラメーターは、ポップされるクリーンアップ・ルーチン を実行するのか、廃棄するのかを指定します。値がゼロ以外の場合には、クリーンアップ・ルーチンは実行されます。

pthread_cleanup_push() と pthread_cleanup_pop() は、プログラムの 同じ字句範囲内で対として出現する必要があります。そうでないと未定義の動作の結果となります。

スレッドが終了すると、プッシュされたがまだポップされていないすべての クリーンアップ・ルーチンは、クリーンアップ・スタックからポップされ、後入れ先出し (LIFO) 順序で実行されます。これは、スレッドが次の場合に起こります。
  • pthread_exit() を呼び出す
  • 開始ルーチン (pthread_create() の結果として制御を取得する) から戻る
  • pthread_cancel() のため取り消される

戻り値

pthread_cleanup_pop() は、値を戻しません。

この関数は、ステートメントとして使用されます。

pthread_cleanup_pop() ステートメントの処理時に エラーが発生した場合には、終了条件が発生します。

設定される errno 値はありません。 perror() または strerror() を使用すると、エラーの原因を判別することができます。

CELEBP15
⁄* CELEBP15 *⁄
#define _OPEN_THREADS
#include <pthread.h>
#include <stdio.h>

int iteration;

void noise_maker(void *arg) {
  printf("hello from noise_maker in iteration %d!¥n", iteration);
}

void *thread(void *arg) {
  pthread_cleanup_push(noise_maker, NULL);
  pthread_cleanup_pop(iteration == 1 ? 0 : 1);
}

main() {
  pthread_t thid;
  void * ret;

  for (iteration=1; iteration<=2; iteration++) {

    if (pthread_create(&thid, NULL, thread, NULL) != 0) {
      perror("pthread_create() error");
      exit(1);
    }

    if (pthread_join(thid, &ret) != 0){
      perror("pthread_join() error");
      exit(2);
    }
⁄*
    if (pthread_detach(&thid) != 0) {
      perror("pthread_detach() error");
      exit(3);
    }
 *⁄
  }
}
出力:
hello from noise_maker in iteration 2!

関連情報