게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
C++ 멀티쓰레드 에대해 좀 아시는분..
게시물ID : programmer_17251짧은주소 복사하기
작성자 : GQTeleVi
추천 : 0
조회수 : 1422회
댓글수 : 5개
등록시간 : 2016/05/17 12:41:10
옵션
  • 본인삭제금지
안녕하세요 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만큼의 시간이 걸려야 하는거 아닌가요?





전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호