Я новичок в многопоточном программировании на C ++. Я написал простой кусок кода, который я вставлю ниже. При запуске в двух потоках код заканчивается чуть быстрее, чем при однопоточном. Я сталкивался с другими подобными вопросами, однако они отличаются, так как у меня нет общих ресурсов, к которым оба потока должны будут обращаться :
Код ниже:
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
using namespace std;
typedef unsigned long long ull;
ull oddSum = 0;
ull evenSum = 0;
void addOdd(){
for(int i = 1; i <= 1999999999; i++){
if(i % 2 == 1)
oddSum += i;
}
}
void addEven(){
for(int i = 1; i <= 1999999999; i++){
if(i % 2 == 0)
evenSum += i;
}
}
int main(){
auto startTime = std::chrono::high_resolution_clock::now();
//Two threads
std::thread t1(addEven); //launch the two threads to run
std::thread t2(addOdd);
t1.join();
t2.join(); //wait for both to finish
//One thread
//addEven();
//addOdd();
auto stopTime = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(stopTime - startTime);
cout << "Odd Sum: " << oddSum << endl;
cout << "Even Sum: " << evenSum << endl;
cout << elapsed.count()/(double)1000000 << endl;
return 0;
}
Когда я работаю с однопоточным , среднее значение для 10 прогонов составляет около 7,3 секунд .
Когда я работаю с двумя потоками , среднее значение для 10 циклов составляет около 6,8 секунд .
Поскольку подавляющее большинство времени занимают циклы в функциях, я считаю, что параллельное выполнение двух потоков, каждый с одна функция, которая вдвое сокращает время, необходимое для выполнения.
Примечание 1 : я знаю, что время не может быть должным образом уменьшено вдвое, более образованное предположение может быть Время выполнения до 5 секунд в двух потоках. Я понимаю, что создание объектов потока имеет свои издержки.
Примечание 2 : Может быть, я что-то упустил, но потоки не имеют доступа к общему расположению между ними.
Любая идея приветствуется. Я знаком с теорией параллельного программирования, и сейчас я только начинаю приобретать практический опыт. У меня Intel i7 с 4 ядрами.