複数のスレッドがメソッドを呼び出し、timer_createと timer_settimeでタイマーを設定します。私は、ハンドラが呼び出されたとき= &info;C++の複数のスレッドのtimer_create
しかし、それは別のスレッドID(おそらく、主な機能のid)が付属していますし、私の
sev.sigev_value.sival_ptrにスレッドIDを渡すためにしようとしていますキャンセルメソッドは呼び出されません。
timer_t timerid; struct sigevent sev; struct itimerspec its; long long freq_nanosecs; sigset_t mask; struct sigaction sa; sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = &handler; sigemptyset(&sa.sa_mask); sigaction(SIGUSR1, &sa, NULL); sev.sigev_notify = SIGEV_SIGNAL; sev.sigev_signo = SIGUSR1; sev.sigev_value.sival_ptr = &info; timer_create(CLOCK_REALTIME, &sev, &timerid); /* Start the timer */ its.it_value.tv_sec = 3; its.it_value.tv_nsec = 0; its.it_interval.tv_sec = its.it_value.tv_sec; its.it_interval.tv_nsec = its.it_value.tv_nsec; timer_settime(timerid, 0, &its, NULL);
今ハンドラは、私の問題は、私は正しく、呼び出し元のスレッドから来ている一意の値に基づいて、キャンセルメソッドを呼び出すために識別するための適切な方法を識別することができないということです
Info *inc; inc = (Info *)si->si_value.sival_ptr; std::thread::id thread_id = std::this_thread::get_id(); if(inc->thread_id != thread_id){ LOG << "This thread is not blocking"; } else { printf("Caught signal %d from timer\n", sig); cancel(...); }
です。
任意提案
「SIGEV_SIGNAL」(シグナルをプロセスに送信する)ではなく、 'SIGEV_THREAD_ID'(特定のスレッドでシグナルをターゲットにする)を使用しているのでしょうか? – Hasturkun
これがシグナルハンドラのコードであれば、そこで呼び出される関数は非同期シグナルセーフではありません。つまり、未定義の動作です。 –
@ MaximEgorushkinこれはシグナルハンドラのコードです。非同期シグナルを安全にするためにはどうすればよいですか? – cateof