2017-01-14 4 views
3

私はアトミックに実行したい文のシーケンスを持っています。簡単にするために聞かせてのは、彼らがブロック文で囲まれていると言う:文ブロックのアブソリュート実行

{ 
    // statements... 
} 

C++ 14でこのようなことを行うための任意の簡単な方法はありますか?

明確にするために、私はこのブロックを1つのアトミック操作のように実行します。ミューテックスで保護するための重要なセクションはありません。問題は、バンドルされた操作が、シーケンス内の最初のステートメントと最後のステートメントの間で複数のコンテキスト切り替えを行わずに実行される必要があることです。

+3

まだです。将来の計画。 'std :: unique_lock'を使ってください。 – DeiDei

+1

@DeiDei原子ブロック中の割り込みやスレッドのスケジューリングを防ぐために、リアルタイムカーネルの機能がなくても、これからのC++ではどのようにこれが可能ですか? –

+2

@RichardCritten [N4514](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4514.pdf)を見てください。 'synchronized'と' atomic'ブロックを提案します。 – DeiDei

答えて

2

「直感的」とは何かを意味します。私はstd::unique_lockがかなり使いやすいと思う。

{ 
    std::unique_lock lock(m_mutex); 
    // sequence of operations 

    // lock destructor will release mutex 
} 

唯一の問題は、ミューテックスで保護された変数を操作する任意のの場所でもが同じことをしなければならないということです。 ません

編集

を明確に質問に答えるために。

コンテキストスイッチを防止するには、適切なReal Time Operating System(RTOS)を使用し、その機能を使用する必要があります。 LinuxやWindowsのような汎用OSで動作している場合(ビジュアルスタジオタグは後者を示唆しています)、コンテキストスイッチの可能性を低くするさまざまなプラットフォーム固有の呼び出しがありますが、それらを防ぐことはできません。

(あなたはカーネルモードで実行する場合は、コンテキストにくくなるスイッチが、それでもそれはで切断割り込みハンドラと、ページフォールトハンドラを停止するのは難しい。)

+0

OPは真のアトミック性ではなく相互排除性が良いですか? – ildjarn

+1

しかし、*真実性*は、カーネルモードに関係します(そして、C++の範囲外です)。 –

+0

ありがとうございました。私は質問を編集してください、見てください。 –