私は(Qtで)マルチスレッドに取り組んできましたが、詳細な知識がありません。ランタイムが実行コードを複製することは決してないと思います。関数は、すべての呼び出し元またはオブジェクトが呼び出すために使用する正確に 1 つのメモリ位置に残ります。マルチスレッドでは、各スレッドが独自のスタック、命令ポインターなどを取得することを読みました。次のようなアセンブリ アルゴリズムに変換されるグローバル関数があるとします。
//GlobalFunction()
instruction 1 : move value 4 into accumulator
instruction 2 : add 5 to content of accumulator
instruction 3 : subtract 1 from content of accumulator
//some more stuff and function returns
//thread 1
call GlobalFunction()
//thread 2
call GlobalFunction()
スレッド 2 がスライスを取得して命令 1 を実行している間、スレッド 1 の命令ポインタが命令 3 を指している可能性があります。この後、スレッド 1 は命令 3 を実行します。もしそうなら、非静的ローカル変数のみを使用する関数がマルチスレッド環境でロックを必要としないのはなぜですか?
PS:また、単一の命令は命令のグループではなくアトミックであると想定しているため、実装では、別のスレッドの命令を実行する前に、レジスタデータを記憶域の場所にフラッシュする機会が得られない可能性があります。