シグナルハンドラに引数(構造体へのポインタなど)を渡すにはどうすればよいですか? グローバル変数を使用できないので、マルチスレッドアプリケーションを作成していますCのシグナルハンドラへの引数の受け渡し
私は各スレッドにタイマーを関連付けます。タイマーが切れると、私は構造体を更新する必要があります(各スレッドは異なる構造体を持っています)。
どうすればいいですか?
シグナルハンドラに引数(構造体へのポインタなど)を渡すにはどうすればよいですか? グローバル変数を使用できないので、マルチスレッドアプリケーションを作成していますCのシグナルハンドラへの引数の受け渡し
私は各スレッドにタイマーを関連付けます。タイマーが切れると、私は構造体を更新する必要があります(各スレッドは異なる構造体を持っています)。
どうすればいいですか?
システムによってシグナルハンドラが呼び出される方法は固定されています。これを変更して追加のユーザポインタを追加する方法はありません。したがって、シグナルハンドラに追加データを取得したい場合は、それを行う唯一の方法はグローバル変数(スレッドローカルの可能性があります)を使用することです。
timer_create
スレッドを使用する場合は、SIGEV_SIGNAL
ではなくSIGEV_THREAD
を使用するほうがずっと良いでしょう。後者は、信号スレッドではなく、プロセスに信号を送信するため、プロセスのどのスレッドでもキャッチされる可能性があります。
glibcは_Thread_local変数を遅く、動的に割り当てます(あまり好きではないmalloc呼び出しで)、_Thread_localへの最初のアクセスはAS安全ではないようです。私はこれについて、より多くの情報を見つけることができませんでした。 – PSkocik
POSIXタイマーでは、に記載されているstruct sigevent
構造体を使用して、プロセスに期限切れを通知する方法の詳細を指定できます。
.sigev_value.sival_ptr
メンバーを設定することができます(
struct sigaction
の
.sa_sigaction
部材を介してシグナルハンドラを設定する必要があります構造体の
.sa_flags
が
SA_SIGACTION
でORredであることを確認しながら)。
スレッドローカル変数の使用はどうですか? –
シグナルハンドラにスレッドローカル変数を渡すにはどうしたらいいですか? – WindowsEFI
あなたはもっと明確になりますか?信号の種類は何ですか?そしてあなたが望む出力形式は何ですか? –