複数のスレッドが特定のログファイルにアクセスしたときに、同期を達成するためのサンプルコードを提供できます。クリティカルセクションオブジェクトの使用について聞いたことがありますが、同じセクションオブジェクトを使用する方法については明確ではありません。スレッド間のC++エラーログファイルの同期
答えて
実装の詳細は、現在のプラットフォーム(Win32、Posix、...)と使用するライブラリ(QT、ブースト、...)によって異なります。しかし、一般的な考え方は同じで、使用できるプリミティブには同等のものがあります。
このseries of articlesは、さまざまなプラットフォームで利用可能なオプションと同等のものをよく理解しているはずです。これにより
あなたはCriticalSection
クラスを記述することができるはずです。
class CriticalSection
{
// System specific object
public:
CriticalSection();
~CriticalSection();
void Lock();
void Unlock();
};
を次に、あなたのログファイルにデータを送信するために、あなたは、ロックを取得データを送信してからロックを解除します。
static CriticalSection gLogFileCS;
static std::ofstream* gLogFilePtr;
void SendLogMessage(const char* message)
{
gLogFileCS.Lock();
gLogFilePtr->write(message);
gLogFileCS.Unlock();
}
あなたはおそらく、あなたはそれで終わったときには、必ずCriticalSection
のロックを解除することを確認するために、RAIIを使用する必要があります。あなたは、CriticalSectionScopeLock
クラスを作成
class CriticalSectionScopeLock
{
CriticalSection& CriticalSection_;
public:
CriticalSectionScopeLock(CriticalSection& cs)
: CriticalSection_(cs)
{
cs.Lock();
}
~CriticalSectionScopeLock()
{
cs.Unlock();
}
};
、その後SendLogMessage
機能はそのように書き換えることができます:
void SendLogMessage(const char* message)
{
CriticalSectionScopeLock lock(gLogFileCS);
gLogFilePtr->write(message);
}
これは、押したときに(あなたがロックを取るキューにメッセージを投稿することによって改善することができますそのキューにデータを書き込んでいる別のスレッドがある場合に発生します。これは、ディスクへの書き込みが現在のスレッドをブロックする可能性があるため、ロックの競合を減らします。また、同期リソースを保持している間にスレッドブロックを持つことは一般的には好ましくありません。
非常に良い答え – patriiice
- 1. スレッド間のスタックの同期
- 2. C#スレッドと同期
- 3. スレッド同期の問題C++
- 4. C++の非同期スレッド
- 5. 2つのスレッド間のキューの同期
- 6. C言語のスレッド間のグローバル変数同期
- 7. C#スレッド非同期処理
- 8. Objective Cで2つのスレッドを同期
- 9. C#(WPF)非同期スレッド、GUIへのインターフェイス
- 10. 同期スレッドでの同期の問題
- 11. Javaのスレッド/同期
- 12. Androidスレッドの同期
- 13. 非同期スレッドと同期スレッドの違い
- 14. Pythonスレッド同期
- 15. スレッド同期は
- 16. スレッドと同期
- 17. スレッド同期
- 18. 非同期スレッド
- 19. ウェブとCの間のデータの同期#
- 20. Pythonでのスレッドの同期
- 21. 2つのスレッドの同期
- 22. スレッド同期 - プロセスの最大スレッド数
- 23. Javaの同期とスレッド
- 24. スレッドの停止と同期
- 25. Javaのスレッド - 同期(本)
- 26. スレッド同期の問題
- 27. スレッドと同期の例
- 28. スレッドの同期やvolatileキーワード
- 29. のJavaスレッド同期方法
- 30. UIスレッドとの同期
マルチスレッド(boost、Qt、...)のライブラリはありますか?どのような種類のログファイルを使用していますか?ちょうどfstreamやカスタムクラスですか? – Philipp