NO_OF_PROCESSORS
CPUにハイパースレッディングがあるため、4が表示されます。ハイパースレッディングは、単一のコアが同じアプリケーションの2つのスレッドを多かれ少なかれ同時に実行できるようにする技術のIntel商標です。たとえば、一方のスレッドがデータをフェッチし、もう一方のスレッドがALUにアクセスしている限り機能します。両方が同じリソースを必要とし、命令を並べ替えることができない場合、1つのスレッドが停止します。これが、2つあるのに4つのコアが表示される理由です。
動的メモリが使用できるのはコアの1つだけですが、IMOは正しくありませんが、コンテンツを登録し、場合によってはコンテンツをキャッシュします。RAMにあるものはすべて、すべてのCPUで使用できる必要があります。
オペレーティングシステムのスケジューラーの動作やデータへのアクセス方法などに応じて、CPUよりも多くのスレッドが役立ちます。コードのベンチマークを行う必要があることを確認します。他のすべては単なる当て推量になります。
それとは別に、Qtを学ぼうとしているのであれば、これは心配するのが正しいことではないかもしれません...
編集:
あなたの質問に答える:スレッドの数を増やした場合にプログラムがどれだけ遅く/速く実行されるかを実際に伝えることはできません。あなたがしていることに応じて、これは変わります。たとえば、ネットワークからの応答を待っている場合は、スレッドの数をさらに増やすことができます。スレッドがすべて同じハードウェアを使用している場合、4つのスレッドは1よりもパフォーマンスが良くない可能性があります。最良の方法は、単にコードをベンチマークすることです。
理想的な世界では、4つまたは8つのスレッドを実行している場合、数値を計算しても違いはありません。正味の時間は同じである必要があります(コンテキストスイッチの時間を無視するなど)。応答時間は異なります。重要なのは、理想的なものは何もないということです。キャッシュがあり、CPUはすべて同じバスを介して同じメモリにアクセスするため、最終的にはリソースへのアクセスをめぐって競合します。次に、特定の時間にスレッド/プロセスをスケジュールする場合としない場合があるオペレーティングシステムもあります。
また、同期オーバーヘッドの説明を求めました。すべてのスレッドが同じデータ構造にアクセスする場合は、更新中に無効な状態のデータにスレッドがアクセスしないように、ロックなどを行う必要があります。
2つのスレッドがあり、どちらも同じことをしていると仮定します。
int sum = 0; // global variable
thread() {
int i = sum;
i += 1;
sum = i;
}
これを同時に実行する2つのスレッドを開始すると、出力を確実に予測できなくなります。次のように発生する可能性があります。
THREAD A : i = sum; // i = 0
i += 1; // i = 1
**context switch**
THREAD B : i = sum; // i = 0
i += 1; // i = 1
sum = i; // sum = 1
**context switch**
THREAD A : sum = i; // sum = 1
結局、スレッドを2回開始したとしても、ですsum
。これを回避するには、共有データへのアクセスを同期する必要があります。通常、これを行うには、必要な限りへのアクセスをブロックします。同期オーバーヘッドは、リソースが再びロック解除されるまでスレッドが待機し、何もしない時間です。1
2
sum
sum
スレッドごとに個別の作業パッケージがあり、共有リソースがない場合は、同期のオーバーヘッドがないはずです。