グローバル変数、ローカル静的変数、またはローカル静的オブジェクトが一度しか構築できないことをシステムはどのようにして認識するのでしょうか?

1. 例:シングルスレッドの場合: objx は静的オブジェクトであるため、データ領域にそのスペースが存在します。objx が作成されたかどうかをマークするために、そのアドレスの上下に 4 バイトのスペースがあります。

  • まず、最初のマークは 0 で、objx が作成されていないことを意味します。

 

  • 静的オブジェクトを作成するステートメントを実行すると、システムはタグ値を照会します。タグ値が 0 の場合、コンストラクターが呼び出されて objx を作成し、タグ値が 1 に変更されます。

 

  •  静的オブジェクトを作成するステートメントが再度実行されると、タグ値が照会されます。タグ値が 1 の場合、コンストラクタは objx オブジェクトを作成するために再度呼び出されず、システムは静的オブジェクトが 1 回だけ作成されることを保証します。 。

2. マルチスレッドでは、funa と funb の両方のスレッド関数が GetObject() 関数を呼び出して objx を作成しており、funa が objx のタグ値を読み取り、その値が 0 であれば objx を作成します。 funb スレッドは objx のタグ値も読み取っていますが、この時点では値は変更されておらず 0 のままであるため、objx が 2 回作成される可能性があります。静的オブジェクト objx が 2 回作成されることによって引き起こされる問題は、スレッド funb がスレッド funa によって初期化された objx の値を上書きすることです。

 このマーク値はシステムによって維持されるため、ミューテックスを使用してこのマーク値を保護することはできませんが、スレッドをロックし、 funa の実行時にスレッドをロックし、実行後にロックを解除してからスレッド funb を実行することはできます。funa を実行すると、objx のマーク値が 1 に変更されることが保証されます。 funb を実行すると、マーク値は 1 として読み取られ、objx 静的オブジェクトが 2 回作成されることはありません。

 

おすすめ

転載: blog.csdn.net/weixin_53472334/article/details/131989299