안녕하세요 C++ 멀티쓰레드에 대해 조금 보고 있는 학생입니다.
바로 본론으로 들어가서 멀티쓰레드를 이용하면 작업을 parallel 하게 해주어서 수행시간을 줄일 수 있는 효과가 있는것 아닌가요?
예를들어 100000000 개의 숫자가 있고 그것을 다 더해주는 작업을 합니다. 쓰레드 2개를 이용한다면 수행시간 비교시 쓰레드를 이용하지 않을때의 절반이 나와야 하는거 아닌가요?
밑에 코드를 보여드리겠습니다.
#include <vector>
#include <iostream>
#include <thread>
#include <future>
#include <cmath>
using namespace std;
#define iterationNumber 1000000
void myFunction(const int index, const int numberInThread, promise<unsigned long>&& p, const vector<int>& numberList) { // const 붙여야 에러 안남 : attempt to use a deleted function
clock_t begin,end;
int firstIndex = index * numberInThread;
int lastIndex = firstIndex + numberInThread;
vector<int>::const_iterator first = numberList.cbegin() + firstIndex;
vector<int>::const_iterator last = numberList.cbegin() + lastIndex;
vector<int> numbers(first,last);
unsigned long result = 0;
begin = clock();
for(int i = 0 ; i < numbers.size(); i++) {
result += numbers.at(i);
}
end = clock();
cout << "thread" << index << " took " << ((float)(end-begin))/CLOCKS_PER_SEC << endl;
p.set_value(result);
}
int main(void)
{
vector<int> numberList;
vector<thread> t;
vector<future<unsigned long>> futures;
vector<unsigned long> result;
const int NumberOfThreads = thread::hardware_concurrency() ?: 2;
int numberInThread = iterationNumber / NumberOfThreads;
clock_t begin,end;
for(int i = 0 ; i < iterationNumber ; i++) {
int randomN = rand() % 10000 + 1;
numberList.push_back(randomN);
}
for(int j = 0 ; j < NumberOfThreads; j++){
promise<unsigned long> promises;
futures.push_back(promises.get_future());
t.push_back(thread(myFunction, j, numberInThread, std::move(promises), numberList));
}
for_each(t.begin(), t.end(), std::mem_fn(&std::thread::join));
for (int i = 0; i < futures.size(); i++) {
result.push_back(futures.at(i).get());
}
unsigned long RRR = 0;
begin = clock();
for(int i = 0 ; i < numberList.size(); i++) {
RRR += numberList.at(i);
}
end = clock();
cout << "not by thread took " << ((float)(end-begin))/CLOCKS_PER_SEC << endl;
}
하드웨어 컨커런시가 4이기 때문에 4개의 스레드를 생성합니다.
각 스레드가 1/4 만큼의 리스트를 떼어가 각 숫자를 더해주는데 수행시간을 보면
thread0 took 0.007232
thread1 took 0.007402
thread2 took 0.010035
thread3 took 0.011759
not by thread took 0.009654
쓰레드를 사용하지 않을때보다 크게 나오는건 왜 그런가요. 각 스레드는 1/4만큼의 시간이 걸려야 하는거 아닌가요?