2012-04-29 11 views
0

私はマルチスレッドのlibonionライブラリを利用して何かを書いていますが、現在宣言されているファイルポインタがあるかどうかを検出する方法を知りました。他のスレッドか否か。ファイルが現在読み取られているかどうかの検出

(基本的に私は、彼らはもはやそれから誰の読み取り場合は削除している手動で取り扱わ一時ファイルを作成したい。)

+1

あなたは、オープンした後で一時ファイルを削除することができます。最後のプロセスを閉じた後、ファイルシステムから自動的に削除されます。 – hochl

+1

hochlは何を言ったか。一時ファイルを削除するのを待つ理由はありません。 stdio 'tmpfile'関数をうまく実装すると、ファイルが返される前にファイルを削除する必要があります。 –

答えて

0

ファイルポインタはファイルのリソースへといくつかの他のスレッドを読んでいるかどうかだけのポインタですポインタを見るだけでは判断できません。ファイルポインタの横にmutexとグローバルロックカウントを宣言することができます。どのスレッドもそれを読み込もうとしているときは、mutexの共有ロックを取得してロックカウントを増やし、スレッドがそれ以上ファイルを読み込もうとしないときにロックカウントを減らした後に解放します。

このロックカウントを照会して、値がゼロであるかどうかを確認できます。その場合、安全に解放できます。

このロックカウントはグローバルで、競合状態になる可能性があるため、ロックカウント変数の読み取りと更新は排他的に行う必要があります。

+0

POSIXはこの目的のために' rwlock'プリミティブを提供しています。また、もしOPが本当に低レベルのファイルディスクリプタへのアクセスではなく 'FILE * 'を本当に使用しているのであれば、複数のスレッドが同じ' FILE'を一度に読み込んでいる場合に意味のあることはほとんどありません。 (単一の)読み込みスレッドは、その使用の間だけ 'flockfile'を呼び出すことができ、完了したら' funlockfile'を呼び出すことができます。一時ファイルを取得したいスレッドは、 'ftrylockfile'を使ってファイルがまだ使用中であるかどうかテストすることができます。しかし、それでもコメントのようにして、問題全体を避ける方が良いと思います。 –

関連する問題