私は、シグナルハンドラー内のバイナリサーチツリー(BST)を読み取る必要がある状況にあります(私の知る限り、スレッドベースごとのSIGSEGVシグナルハンドラー)。BST は、アプリケーション内の他のスレッドによって変更できます。
シグナルハンドラはセマフォやミューテックスなどを使用できないため、共有データにアクセスできません。この問題を解決するにはどうすればよいですか? 私のアプリケーションはマルチスレッドで、マルチコア システムで実行されていることに注意してください。
私は、シグナルハンドラー内のバイナリサーチツリー(BST)を読み取る必要がある状況にあります(私の知る限り、スレッドベースごとのSIGSEGVシグナルハンドラー)。BST は、アプリケーション内の他のスレッドによって変更できます。
シグナルハンドラはセマフォやミューテックスなどを使用できないため、共有データにアクセスできません。この問題を解決するにはどうすればよいですか? 私のアプリケーションはマルチスレッドで、マルチコア システムで実行されていることに注意してください。
私は2つの非常にクリーンな解決策を見ることができます:
シグナル ハンドラから共有データにアクセスしないでください。シグナルの詳細については、次の記事を参照してください。
これまでのところ、Linux でシグナルを処理する最も安全な方法は signalfd のようです。
SH が共有データに直接アクセスできないと仮定すると、間接的にアクセスできる可能性があります。
SIGSEGV の重複が心配な場合は、カウンターをミックスに追加して追跡してください。(やあ! 独自のセマフォを作成しました!)
ここでの弱点は明らかにポーリングですが、これが始まりです。
mmap - フューズファイルシステム (ユーザー空間内) を検討することもできます。
実際には、外部ページャーをサポートしているGnu Hurdの方が満足するでしょう。
また、シグナル ハンドラーでバイナリ サーチ ツリーを読み取るハックは、実際には、移植性がなく、カーネルのバージョンに依存する方法で機能することがよくあります。おそらく、移植性の低い低レベルのトリック ( futexやアトミック gcc builtinsなど) を使用したアクセスのシリアル化が機能する可能性があります。NPTL の (マシン固有の) ソース コード、つまり現在の Linux pthread ルーチンを読むと役立つはずです。
etc は実際には Linux シグナルハンドラ内から使用できる可能性pthread_mutex_lock
があります... (おそらくfutex
アトミック命令のみを行うため)。