2012-04-11 1 views
0

マルチスレッドで同じファイルに書き込むためのクロスプラットフォームソリューションが必要(少なくともWindowsとMac OS X)異なるファイル領域に異なるスレッドを書き込む。クロスプラットフォーム環境下でQtのマルチスレッドで同じファイルの別の領域に書き込む方法は?

ファイルが少し大きいです。数GBでも数百MBでもかまいません。だからMMFは正しく適合しません。

QFileはクロスプラットフォームのオーバーラップです。 QFile文書を検索しましたが、共有書き込みオプションはありません。

Windowsでは、これはFILE_SHARE_WRITEオプションを使用してCreateFileによって実行できます。 Mac OS Xはどうですか?

Qtはこれをサポートしていますか、自分でカプセル化する必要がありますか? Mac OS Xでこれを行うには?

+1

同期書き込みよりも並列書き込みの利点はありますが、これはほとんどCPUに拘束されない問題であり、一部の(低い)レベルでは書き込みを同期させる必要があるからです。 –

+0

パフォーマンスを考慮して、ノンブロッキングIOを使用して、ロックを考えずにすべてのスレッドに単一のファイルに書き込むように依頼します。ボトルネックCPU/IOをチェックします。 – Nickolas

+0

@Frank Osterfeld [link](http://social.msdn.microsoft.com/Forums/en/parallelcppnative/thread/042c3ef8-742d-4eda-9c74-018516d86b8c)は、いくつかの調査をした後、私に多くのことを明確にしています。あなたが言うように、ボトルネックはIOであり、同時書き込みは助けにならない。 – Nickolas

答えて

0

QFileには、QReadWriteLockdocumentation)を使用できます。

+0

多分私の質問は明確ではない、私は並行して書くことを意味する。私は私の質問を更新します。すべて同じようにありがとう。 – Nickolas

+0

マルチプロセス書き込みを意味しますか? 'FILE_SHARE_WRITE'は他のプロセスだけがファイルを開くことを可能にし、実際の同時書き込みは処理しません。複数のスレッド/プロセスが同時にファイルに書き込む場合、ファイルが有効であることをどのように確認しますか?バイトの順序はランダムです。 – larsmoa

+0

私の状況では、1つのプロセスがあります。別の領域へのスレッドの書き込みが異なるため、ファイルは有効です。 – Nickolas

0

Mac OS Xでは、複数のプロセスやスレッドがファイルを開き、その中に書き込みを行うことはできません。ただし、これらのプロセスやスレッドが具体的に協調ロックスキームを選択している場合を除きます。このようなオプトイン協調ロック方式は、「アドバイザリロック」と呼ばれます。たとえば、ファイル全体をロックする場合はflock()、バイトレンジロックの場合はfcntl()とします。

QFileがどのように実装されているかに応じて、マルチスレッド書き込みをそのままそのまま行うことができます。それを拒否するには特別な手続きが必要です。

もちろん、スレッドやプロセスが何らかの方法で調整しないと、互いのデータを上書きして破損する危険性があります。

関連する問題