マルチスレッドの同時実行に基づく - なぜマルチスレッドをロックする必要があるのか

1. スレッド間のプライベートおよび共有リソース

1. プライベート:
スレッド スタック、レジスタ、プログラム レジスタ

2. 共有:
ヒープ、アドレス空間、グローバル変数、静的変数

次に、スレッドはメモリ データ プロセスの読み取りと書き込みを行います。

1. 読み取り
1) メモリの内容を CPU レジスタにコピーします。負荷

2. 書き込み
1) メモリの内容を CPU レジスタにコピーします。負荷
2) CPU 内の値を増やします。インクリメント
3) 新しい値をメモリに保存します。

3. メモリ内容を CPU レジスタにコピーします。
1) 設定されたアライメント バイト (単一コピーの最小値) に従ってメモリをコピーします。
2) システムおよび CPU アーキテクチャの最適化などにより、単一コピーの最小値はこの値よりも大幅に大きくなる場合がありますが、メモリは連続していることが保証されています。

3. なぜロックする必要があるのか

1. データ競合 (データ競合)
1) 複数のスレッドが共有リソース (ヒープ、グローバル変数など) にアクセスする場合、ロック (相互排他ロック、読み書きロック、再帰的ロックなど) が必要です。そうでないと、ロックが発生する可能性があります。レジスタとメモリデータが矛盾している可能性があります。
注:ヒープ オブジェクトの作成は、メモリの割り当て、初期化、メモリへのポインタに分かれており、きめ細かいロックに注意してください。
2) スレッドのプライベート リソースをロックする必要はありません。

2. 異なるスレッドのサブステップには連続した関連性があります。
1) 例:

int a = 0;

//Thread1
a = 1;

//Thread2
int b = 10/a;

つまり、スレッド 2 は、a を除算する前に、スレッド 1 が変数 a に値 1 を割り当てるのを待つ必要があります。
注:条件変数(std::condition_variable)の使用シナリオです。
2)
現在の CPU とコンパイラはさまざまな方法でコードの最適化を試み、最適化するためにプログラムを作成するときにプログラマが指定したコードを実行する場合があるため、コードの順序はプログラムの実行順序と同じではありません。混乱によって引き起こされるパフォーマンス。

//Thread1
a = 1;
b = 2;

コード「b=2;」は「a=1」より前に実行される場合があります。

間違いや不足がある場合は、コメントやご指摘をお待ちしております。作成は簡単ではありませんので、転載の際は出典を明記してください。お役に立ちましたら、ぜひ「いいね」とフォローをお願いいたします (⊙o⊙)
詳細については、私の個人ブログをフォローしてください: https://blog.csdn.net/qq_43148810

おすすめ

転載: blog.csdn.net/qq_43148810/article/details/128815249