私はマルチスレッドプログラミングの初心者で、pthead_cond_wait()
で待機中にシグナルが送信されたとき、その結果はOSによって異なることがわかりました。 誰かがコールがどのように中断されたか、そして移植可能なコードを書く方法を知る方法を教えてもらえますか?文書化されているようにpthread_cond_wait()とsignal、結果はOSに依存する
MacOS X 10.11.4
cc -o condwait condwait.c -lpthread
Linux 2.6.32-642.3.1.el6.x86_64
gcc -o condwait condwait.c -lpthread
Solaris11 5.11 11.2
cc -D_POSIX_C_SOURCE -D_REENTRANT -mt -o condwait condwait.c -lpthread
MacOS X
$ ./condwait &
[1] xxxxx
$ kill -USR1 %1
signal called
after pthread_cond_wait : 0
error pthread_cond_wait:: Unknown error: 260
Solaris
$ ./condwait &
[1] xxxxx
$ kill -USR1 %1
signal called
after pthread_cond_wait : 0
error pthread_cond_wait : Error 0
Linux
$ ./condwait &
[1] xxxxx
$ kill -USR1 %1
signal called
$ jobs
[1]+ Running
#include <stdio.h>
#include <signal.h>
#include <pthread.h>
void
sigusr1_handler(int sig)
{
printf("signal called\n");
}
int
main()
{
int n;
pthread_mutex_t mut;
pthread_cond_t cond;
struct timespec ts;
signal(SIGUSR1, sigusr1_handler);
pthread_mutex_init(&mut, NULL);
pthread_cond_init(&cond, NULL);
pthread_mutex_lock(&mut);
printf("before cond_wait\n");
n = pthread_cond_wait(&cond, &mut);
printf("after pthread_cond_wait : %d\n", n);
perror("error pthread_cond_wait:");
pthread_mutex_unlock(&mut);
return 0;
}
のSolarisネイティブ
cond_wait()
を使用して、それが
EINTR
を返します。
pthread_cond_wait()
が中断されたことを知る方法はありますか?
親愛なるbarcelona_delpyのような第2のロックが必要になります。 – kaotan
親愛なるbarcelona_delpyさん、あなたの答えに感謝します。私は日本語版のLinuxマニュアルを読んでいます。pthread_cond_timedwaitは、通知されるとEINTRを返します。私はいくつかのマニュアルを探すだろうが、SUS3のマニュアルだけがエラーを返す。それから、MacOS XとSolaris、SUS3で状態を待つ間に信号をブロックする必要があります。よろしくね、 – kaotan