C/C++ のインライン関数はスレッドセーフにする方法ですか?

いいえ、あなたは間違っています。静的変数の場合、インライン化されているかどうかに関係なく、実際には 1 つのインスタンスしかありません。インライン化された関数は、何らかの方法でスレッド セーフに影響を与えません。


関数をインラインとして宣言する場合、それはコンパイラへの単なるヒントです。静的変数は、言語で明確に定義されています。コンパイラが関数をインライン化する場合でも、静的変数を関数のすべてのインスタンス間で共有する義務があります。したがって、それらはグローバルのままであり、MT 環境で保護する必要があります。

ローカル変数に関しては、関数の外部で使用されない限り、関数がインライン化されているかどうかに関係なく、スレッド セーフです。


各スレッドはローカル オブジェクトの独自のコピーを取得するため、インラインにするかどうかに関係なく、スレッド関連の問題は発生しません。

しかし、クラスの静的変数またはメンバー変数にアクセスしている場合、インラインかどうかに関係なく、マルチスレッドに関連するすべての問題 (変数の破損、更新の喪失など) は依然として存在します。