問題タブ [sig-atomic-t]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - volatile sig_atomic_tを使用して、C ++ 03のミューテックスを回避できますか?
アトミック読み取りとインクリメント/デクリメントをサポートするハードウェアを使用している場合volatile sig_atomic_t
、C ++ 03でを使用してアトミック操作にアクセスし、本格的なミューテックスを回避できますか、それともC ++ 11とを待つ必要がありstd::atomic<int>
ますか?
c - C ヘッダー ファイルで volatile sig_atomic_t をグローバルにする
msh.c ファイルで次のように初期化されたグローバル変数を作成しようとしています。
これだけでもよさそうです。ただし、proto.h ファイル (このプロジェクトのすべての c ファイルに含まれています) に移動し、次のように入力すると:
一連のエラーがスローされます。
この変数をグローバルにするにはどうすればよいですか? ありがとう。
c - シグナル処理中に volatile キーワードが使用されていない場合のコンパイラの最適化効果を実証しますか?
次のコードでは、変数quit
has を作成していませんvolatile sig_atomic_t
。無地のままにしてありint
ます。
quit
変数が として指定されていないためvolatile
、コンパイラのオプティマイザーがwhile
コード内の -loop を次のように最適化することを期待していました。
しかし、私はこれが起こっているのを見ません。1 つの端末で、次のコマンドを実行します。
別の端末で、SIGUSR1 を自分のプログラムに送信します。
最初のターミナルの出力は、プログラムのシグナル ハンドラーが呼び出され、while
-loop が終了したことを示しています。
quit
ではないため、ループの最適化をどのように実証できvolatile
ますか?
c - シグナル処理のコンテキストで正確にどの変数を sig_atomic_t にする必要がありますか?
を使用した簡単なおもちゃのプログラムを次に示しますvolatile sig_atomic_t
。
この特定のプログラムの変数にvolatile sig_atomic_t
必要な理由はわかっていると思います。quit
- がない
volatile
と、コンパイラはwhile (!quit) ;
無限ループに最適化する可能性があります。ループの変更が見つからないため、常に残っquit
ていると見なされます。quit
0
- への更新
quit
または読み取りはquit
、単一のマシン命令で発生する必要があります。の更新または読み取りに複数のマシン命令が必要quit
な場合、更新の進行中にシグナル ハンドラーが呼び出されると、シグナル ハンドラーの読み取りで の値が矛盾する可能性がありますquit
。
私はこれまでのところ正しいですか?そうでない場合は、答えを修正してください。
sig_atomic_t
ここで、シグナル処理のコンテキストで必要な場合の一般化されたルールを学びたいと思います。Jonathan Leffler はコメントで、一般化するのは簡単ではないと説明しました。
sig_atomic_t
C標準の観点から、変数を定義する必要がある既知のシナリオのリストを提供できますか? 網羅的なリストである必要はありません。これは、経験の浅い開発者がシグナル処理コードを含む C ソフトウェアを作成する際に参照できるリストになる可能性があります。