0

本質的にpthreadのラッパーであるサードパーティのライブラリについて疑問があります。
結合関数の実装方法は次のとおりです。

            bool Join() throw ()
            {
                ThreadState s;
                {
                    CCriticalSectionLock L(m_CS);
                    s = m_CurrentThreadState;
                }

                if (s == Started) {...}
            }

if (s == Started) {...}ロックが定義されているブロック内にコードを配置 するべきではありませんか?

現状では、クリティカルセクションには変数の割り当てのみが含まれているため、基本的な操作であるため、変数の割り当ては必要ありません。

ありがとうございました。

4

4 に答える 4

2

m_CurrentThreadStateクリティカルセクションのポイントは、他のスレッドによって変更される可能性のあるフィールドの読み取りを保護することです。

于 2012-12-03T15:48:24.927 に答える
2

if (s == Started) {...}ロックが定義されているブロック内にコードを配置するべきではありませんか?

簡単な答え:いいえ。

長い答え:いいえ、クリティカルセクションはの状態のみをカバーしているためですm_CurrentThreadState

このコードsにはローカルスタック変数があり、各スレッドには独自のコピーがあります(つまり、保護する必要はありません)。

コードは、その値へのアクセスをブロックしm_CurrentThreadState、その値を(にs)読み取ります。次に、sの値を使用します(別のスレッドが変更した場合でも、一貫性がありますm_CurrentThreadState)。

于 2012-12-03T15:49:12.297 に答える
1

m_CurrentThreadStateクリティカルセクションは、共有変数( )の読み取りがアトミックに行われることを保証します。C ++は、基本操作がアトミックであることを保証しませんが、最近std::atomicではロックではなく使用できます。

アクセスに続くロジックに対してロックを維持する必要があるかどうかは、スレッドがどのように相互作用するかを注意深く分析する必要がある問題です。うまくいけば、ライブラリの作成者はその分析を行い、ロックを維持せずに値に基づいて行動することが安全であると判断しました。

于 2012-12-03T15:50:46.397 に答える
1

変数sはのコピーですm_CurrentThreadState

関数はロックを短時間保持したいように見えるため、この状態値のコピーを調べます。

このときに状態値が変化しても問題ありませんが、とにかくコードは実行されます。

于 2012-12-03T15:50:47.793 に答える