2016-11-04 9 views
2

私は、特定の操作(またはシステムコール)がアトミックであるかどうかを確認するために(カーネルソースコードを読む以外に)信頼できる方法を見つけたいと思っています(他のプロセスはその操作の前後の状態しか見ることができないその間に何かではない)Linuxで。これの目的は、カーネルがすでに私のためにそれをしている場合、いくつかの操作に不必要なロックを使用するのを避けることです。Linuxで特定の操作(またはシステムコール)がアトミックであるかどうかを確認するにはどうすればよいですか?

これまでのところ、私はこのトピックについてthisのようなリソースしか見つけられませんでしたが、これは決して正式ではありません。また、Linuxのmanページにはこれに関する情報はほとんどありません。たとえば、上記のリンクで言及されているほとんどの関数については、マニュアルページのアトミック性については何も見つかりません。

この情報を提供する標準または公式の文書があれば教えてください。どんな助けでも大歓迎です。

+0

私はLinuxカーネルのエキスパートではありませんが、そのようなリストが存在するかどうかは疑問です。明日のコード作業では、どんな助けになるのでしょうか?しかし、Linux 6.4は今から12.43ヶ月後にリリースされました。突然あなたのロックはもはや必要ではありません。または突然、あなたは1つを必要とします... – GhostCat

答えて

0

私はPOSIXスレッドセーフな関数が良い出発点だと思います。スレッドセーフな関数は、異なるスレッドから呼び出されたときに同じ結果を返す関数です。これはアトミックであることと全く同じではありませんが、少なくとも、どの機能が確実にアトミックでないかについてのヒントを提供します。

POSIX.1-2001およびPOSIX.1-2008では、標準で指定されているすべての関数は、特定の関数セットを除いてスレッドセーフでなければなりません(ほとんどが標準ライブラリに実装されていますが、カーネル)。

スレッドセーフでアトミックではない関数の例として、fwrite()を考えてみてください。 fwrite()は、pthreadロックの下でプロセスごとのバッファに書き込むため、スレッドセーフです。ただし、バッファは別のwrite()チャンクでフラッシュされる可能性があります。そのため、他のプロセスでは、アトミックな書き込みとは見なされません。

+0

スレッドの安全性とアトミック性は、実際には非常に異なる概念であると考える傾向があります。スレッド安全性とは、関数が複数のスレッドから同時に呼び出されたときにデータ競合が発生しないことを意味します。実装上、典型的には、関数が静的変数またはグローバル変数を使用しないことを意味します。しかし、それは他のスレッドがその効果をどのように観測できるかという点で原子性に直接関係していません。あるスレッドが呼び出す関数の効果を観察するために、他のスレッドは同じ関数を全く呼び出す必要はないことにも注意してください。私の理解が間違っていれば私を修正してください。 –

+0

だから、私は「良い出発点だ」と言ったのです。その区別を反映するように答えを更新します。 – Arnout

+0

アトミック操作も_async-safe_です.pthreadミューテックスはそうではありません。具体的には、シグナルが提供されたときにスレッドがミューテックスを保持している場合、非同期シグナルハンドラはそれを取得できません。 –

関連する問題