0

QThreadPool を試す前は、OS のスケジュールによっては、マルチスレッド プログラムの結果が不確実になる可能性があると考えていました。しかし、今日の私の意見は少し変わりました。

main.cpp のコードは次のとおりです。

runnableInst *hInst = new runnableInst("StarWar");
runnableInst *thread = new runnableInst("BlackSmith");
QThreadPool::globalInstance()->start(hInst);
QThreadPool::globalInstance()->start(thread);

これが実行機能です。

void runnableInst::run()
{
//    while(1) {
    for(int i = 0; i < 50; ++i) {
        qDebug()<<"CurrentThread="<< QThread::currentThread();
        qDebug()<<threadName + " is outputing. Count="<<i;
        Sleep(100);
    }
}

これが結果の一部です。 ここに画像の説明を入力

スレッドプールに追加した順番で2つのスレッドが動いているようです。クラス QThreadPool でランダムなスレッド実行結果が得られないということですか?

4

1 に答える 1

3

いいえ、そうではありません..そして、はい、そうです:

スレッドのスケジューリングはランダムではありません。使用されるスケジューリング アルゴリズムと、スケジューラ/ディスパッチャの実行時のすべてのスレッドの状態によって正確に決定されます。多くの設計/システム/シナリオでは、疑似ランダムに見えることがありますが、あなたの例はそれらの1つではありません

あなたの例では、ランナブルは実際の作業をほとんど行わないため、2 つのプール スレッドはそれらを交互に描画して実行するだけです。99.99% の確率で、両方のスレッドが sleep(100) 呼び出しでブロックされます。その時間の終わりに、両方のスレッドが別のランナブルを取得し、一方が他方よりわずかに前になります。

表示されるスケジューリング動作は、サンプル コードのアーティファクトです。一般に、他のデザインや動作に推定することはできません。

于 2012-08-16T08:50:58.207 に答える