1

私は(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:また、単一の命令は命令のグループではなくアトミックであると想定しているため、実装では、別のスレッドの命令を実行する前に、レジスタデータを記憶域の場所にフラッシュする機会が得られない可能性があります。

4

3 に答える 3

7

CPU には 1 セットのレジスタしかありませんが (簡単にするために、シングル コア システムを想定しています)、システムは、各スレッドが独自の個別のレジスタ状態を持つようにレジスタ ファイルを管理します。別のスレッドでは、最初のスレッドのレジスタが保存され、2 番目のスレッドの保存されたレジスタが復元されます。

自動/スタック変数の場合、各スレッドは独自のスタックを取得するため、スレッドがそのような変数を明示的に共有するために何かを行わない限り (アドレスまたは別のスレッドへの参照を渡すことによって)、それらの変数は共有されないため、スレッドセーフです。

于 2012-09-23T10:25:44.917 に答える
2

OS と CPU は、レジスタとさまざまな CPU 状態を処理します。マルチコア CPU には、アクティブなスレッドごとに 1 つずつ、複数のアキュムレータ/レジスタがあります。シングルコア CPU は、命令の途中で中断することはできません。目に見える CPU の状態全体がレジスタにあり、OS によって保存および復元されます。

于 2012-09-23T10:30:17.660 に答える
0

いいえ、各スレッドには独自の実行レジスタもあります (プロセッサが持つアキュムレータを含む)。

マルチプロセッサ システムでは、各プロセッサに独自のレジスタがあり (これが個別のプロセッサを構成するコアです)、複数のスレッドが同じプロセッサに切り替えられると、レジスタの状態が保存および復元されます。

于 2012-09-23T10:27:20.073 に答える