1

私は DCPU-16 エミュレーターを作成しており、別のスレッドで関数 getRealTimeCPUClock() を呼び出すスレッドを起動して、CPU のリアルタイム クロック速度を計算しています。問題は、値が返されていない場合でも、future オブジェクトの「valid」属性が true であるように見えることです。その結果、futureObj.get() を呼び出すと、getRealTimeCPUClock() が戻るまで待機します。

非同期の起動ポリシー (遅延ではなく) では、関数をバックグラウンドで起動し、返されたときに有効な属性を true に設定することは想定されていませんか?

これは間違った使い方ですか?

int getRealTimeCPUClock() {
    int cyclesBeforeTimer = totalCycles;
    sleep(1);

    return totalCycles - cyclesBeforeTimer;
}

void startExecutionOfProgram(char *programFileName)
{
    size_t lengthOfProgramInWords = loadProgramIntoRAM(programFileName);
    auto futureRealTimeClockSpeed = std::async(std::launch::async, getRealTimeCPUClock);

    while(programCounter < lengthOfProgramInWords) {

        if(futureRealTimeClockSpeed.valid()) {
            realTimeClockSpeed = futureRealTimeClockSpeed.get();
            futureRealTimeClockSpeed = std::async(std::launch::async, getRealTimeCPUClock);
        }
        step(); 
    }
}
4

1 に答える 1

3

valid()あなたが思っていることとは異なります (ただし、cppreferenceのエントリは別のことを示唆しています)。

これが標準が述べていることvalid()です:

(§ 30.6.6/18) bool valid() const noexcept;

戻り値: *this が共有状態を参照する場合のみ true。

によって返される値はvalid()、オブジェクトが有効な共有状態に関連付けられているtrue限り有効です。これは通常、 を使用してオブジェクトを起動した後、結果を取得する ( を使用して) 前の場合です。メソッドを使用して を作成すると、も無効になります。これは、あなたがやろうとしていること、つまり結果が利用可能かどうかのチェックとは関係ありません。futurestd::asyncget()futureshare()shared_future

a の結果が準備できているかどうかを判断するには、遅延を 0 にして関数をfuture使用することをお勧めします。wait_for()

if (futureRealTimeClockSpeed.wait_for(std::chrono::seconds(0))
          == std::future_status::ready)
   /*...*/
于 2012-10-10T08:16:41.420 に答える