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