標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.4a |
両方 | 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() は、プログラムの 同じ字句範囲内で対として出現する必要があります。そうでないと未定義の動作の結果となります。
pthread_cleanup_pop() は、値を戻しません。
この関数は、ステートメントとして使用されます。
pthread_cleanup_pop() ステートメントの処理時に エラーが発生した場合には、終了条件が発生します。
設定される errno 値はありません。 perror() または strerror() を使用すると、エラーの原因を判別することができます。
⁄* 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!