Async в C++, два одинаковых потока работают вдвое дольше чем один

Вот минимальный код воспроизводящий проблему:

#include <iostream>
#include <future>
#include <ctime>

using namespace std;

uint test(uint a, uint b)
{
    return a * b;
}

uint calculator(uint counter)
{
    while(counter>0)
    {
        test(2, 2);
        counter --;
    }
    return 1;
}

int main()
{
    clock_t begin, end;
    uint counter = 1000000000;
    begin = clock();
    auto t1 = async(launch::async, calculator, counter);
    auto t2 = async(launch::async, calculator, counter);
    uint a = t1.get();
    uint b = t2.get();
    end = clock();
    cout << "time of the iteration is " << (double(end - begin) / CLOCKS_PER_SEC) << endl;
    return 0;
}

Если запустить только один из потоков - время выполнения 2,5 секунды. А если запустить оба потока - время выполнения 5 секунд. При этом в диспетчере устройств видно, что с двумя потоками одновременно два ядра процессора загружаются на 100%. Что я делаю не правильно? Вот опции компилятора: g++ -pthread main.cpp -o temp


Ответы (1 шт):

Автор решения: User_0

Сейчас увеличил счётчик втрое и измерил время вручную. Оказалось в обоих случаях одинаковое, т.е. async работает нормально.

Просто clock() выдаёт некорректное время, когда используется async.

→ Ссылка