2017-01-26 11 views
2

質問は単純です - C++ 11より前のC++のシンプルですぐに使える解決法は何ですか?私は何も気にする必要はありません - 実行する前に別のコールバック(いつでも起こりうる)が終了するのを待つコードです。C++のミューテックスBEFORE C++ 11

私は毎日のPC、i7などで動作しています。特定のパフォーマンス要件(単純すぎるほど遅くない)はありませんが、1つのプロセスを停止してもう一方のプロセスを終了してから最初のプロセスを再開させるという仕事をしなければなりません。

ありがとうございます!

+1

pthreadsなどのOS固有の機能を使用するか、[boost.mutex](http://www.boost.org/doc/libs/1_58_0/doc/html/thread/synchronization.html#)を試す必要があります。 thread.synchronization.mutex_types)を参照してください。 –

+0

どのターゲットシステムとプロセッサについて、その質問をしていますか? **あなたの質問を編集して**改善し、動機づけるようにしてください。 –

答えて

5

Boost Synchronizationは、有効なオプションです。

Boostを使用したくない場合(質問に基づいて、必要以上に使いすぎるかもしれません)、ターゲットプラットフォームで提供されているAPIの周りに独自のC++クラスラッパーを書くことができます(つまり、POSIX準拠の場合はPOSIX thread mutex)。プラットフォーム、またはMicrosoft Windows OSではWindows MutexesまたはCritical Sections)。

他の人が既に実装しているようなラッパークラスはたくさんあります。つまり、mutexキーワードを使用してGitHubを検索し、コードとC++言語の結果を制限することができます。(here are a lot of results

1

ブーストだけでなく、POCO(そのMutexクラス)またはQt(そのQMutexクラス)にも見えるかもしれません。

POSIX pthreadsのみをターゲットにしている場合は、標準のmutexesの上に独自のミューテックスクラスを作成することができ、何度も実行されています。

しかし、C++ 11に切り替えることはおそらく最近GCCまたはClang/LLVMは(組み込み、またはタブレット/ノートパソコン/デスクトップ/サーバー)多くのプロセッサをサポートしていることを2017年のお知らせで最善のアプローチです。

あなたがすべきを

( - - またはお金おそらくそのソースコードからこれらのコンパイラをコンパイルする、またはその仕事をするために誰かを支払うことによって、何とか最近のGCCやクランを得るために、それは努力の価値かもしれないので)あなたがターゲットとしているコンピュータ(プロセッサ、オペレーティングシステムがあれば、利用可能なメモリ)を説明してください。 POCOやQtやBoostをC++ 03モードでコンパイルできたとしても、小さな組み込みプロセッサ(Arduinoなど)には適合しない可能性があります。

+0

2017でも、残念ながらC++ 11準拠のコンパイラがないプラットフォーム(つまり埋め込み)があります。とにかく、可能な限り(少なくとも)C++ 11への切り替えは、確かに最良のアプローチです。 – roalz

+0

しかし*最近の* GCCやClang/LLVMは多くのプロセッサ(組み込みの世界を含む)をターゲットにすることができますが、もちろんそのすべてではありません。ところで、今日のC++ 11がないプラットフォームでは、(Boost、POCO、Qt)の提案されたソリューションが無駄なく機能するとは思えません。 –

+0

確かに、 "たくさん"は "すべて"を意味しません;-) – roalz

2

posix(ほとんどのUnices)システムでpthreadを使用します。 Windowsでは、あなたの最善の策はCriticalSectionsです。

+0

詳細情報:Win32 APIでは、 "mutex"はプロセス間同期であり、 "クリティカルセクション"はスレッド間(ただし、現在のプロセス外には到達していません) –