mfc_Thread_3 - 8BitsCoding/RobotMentor GitHub Wiki
Thread๊ฐ ํน์ ์์์ ๊ณต์ ํ๋ฉฐ ์ฐ๋ ์์
๊ธฐ์กด์ 200000๊ฐ์ฉ ์ถ๊ฐ๋ก ์์๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์
1600000๊ฐ์ ์์์ ํฉ์ ๊ตฌํ๋๋ฐ 32๊ฐ์ Thread๋ฅผ ์์ฑํด์ ๊ตฌํด๋ณด์.
Thread์ ๊ตฌ์ฑ์ 32๊ฐ์ Thread๋ฅผ ๊ฐ๊ณ
ํ๋์ Thread๋ 2, 34, 66 ....
3, 35, 67 .... ์ด๋ฐ์์ผ๋ก 32์ฉ ๋ํ๋ฉด์ 32๊น์ง ์ด 32๊ฐ์ Thread๋ฅผ ์์ฑํ๊ฒ ๋๋ค.
๊ทธ๋ฐ๋ฐ Core๊ฐ 32๊ฐ๊ฐ ์๋๋ฐ Thread๋ฅผ 32๊ฐ๋ ๋ง๋๋ ์ด์ ๋??
2์ ๋ฐฐ์์ ์์๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์ ๊ธ๋ฐฉ๋๋๊ธฐ์ 32๊ฐ๋ฅผ ๋ง๋ ๋ค ํ๋๋ผ๋ ์ ๋ฐ์ด์์ ๊ธ๋ฐฉ๋๋๊ธฐ๋๋ฌธ!
// Dlg.h
struct ThreadData
{
HWND h_wnd;
CListBox* p_list_box;
HANDLE h_kill_event;
HANDLE h_thread;
DWORD thread_id;
unsigned int start_step, end_step, thread_count;
__int64* p_sum;
};
private:
unsigned int m_step = 1600000;
int m_thread_count = 32;
__int64 m_sum = 0; // ๋ชจ๋ Thread๊ฐ ๊ณต์ ํ ์์
unsigned int m_start_tick;์์๋ฒํผ ํด๋ฆญ ์ 32๊ฐ์ Thread ์์ฑ
if(m_thread_list.GetCount() > 0) return;
m_sum = 0;
m_start_tick = GetTickCount();
ThreadData * p;
for(int i = 0; i < m_thread_count; i++) {
p = new ThreadData;
p->h_wnd = m_hWnd;
p->start_step = 2 + i;
p->end_step = m_step;
p->p_list_box = &m_data_list;
p->thread_count = m_thread_count;
p->p_sum = &m_sum;
p->h_kill_event = CreateEvent(NULL, 1, 0, NULL);
p->h_thread = CreateThread(NULL, 0, InsertItemToList, p, 0, &p->thread_id);
CString str;
str.Format(L"%08x : (%u ~ %u)๊น์ง ํฉ์ฐ", p->thread_id, p->start_step, p->end_step);
m_thread_list.InsertString(i, str);
m_thread_list.SetItemData(i, p);
}DWORD WINAPI InsertItemToList(void* ap_data)
{
ThreadData* p_data = (ThreadData*)ap_data;
CString str;
int start_tick = GetTickCount(), kill_flag = 0;
int index;
unsigned int i ;
for(i = p_data->start_step; i <= p_data->end_step; i += p_data->thread_count) {
if(WaitForSingleObject(p_data->h_kill_event, 0) == WAIT_OBJECT_0) {
kill_flag = 1;
break;
}
if(IsPrime(i)) *p_data->p_sum += i;
}
CloseHandle(p_data->h_)
}// On27001
ThreadData * p = (ThreadData *)lParam;
int count = m_thread_list.GetCount();
for(int i = 0; i < count; i++) {
if(m_thread_list.GetItemDataPtr(i) == p) {
m_thread_list.DeleteString(i);
CloseHandle(p->h_kill_event);
if(wParam == 0) delete p;
else p->thread = NULL;
break;
}
if(count == 1) {
CString str;
str.Format(L"2~%u๊น์ง ์์์ ํฉ์ %lld์ด๋ค. (%ums)", m_step, m_sum, GetTickCount() - m_start_tick);
int index = m_data_list.InsertString(-1, str);
m_data_list.SetCurSel(index);
}
}๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋ ๋์์ m_sum์ ์ฐ๊ฒ ๋๋๊ฒฝ์ฐ???
// Dlg.cpp
CRITICAL_SETCTION gh_sum_lock;
// OnInitDlg
InitializeCriticalSection(&gh_sum_lock);
// OnDestroy
DeleteCriticalSection(&gh_sum_lock);DWORD WINAPI InsertItemToList(void* ap_data)
{
// ...
if(IsPrime(i)) {
EnterCriticalSection(&gh_sum_lock);
*p_data->p_sum += i;
LeaveCriticalSection(&gh_sum_lock);
}
// ...CriticalSection์ ์ธ ๋ ์ฃผ์ ์ฌํญ์ TerminateThread์ ๊ฐ์ ํจ์๋ฅผ ์ฐ๋ฉด Enterํ Leave๋ฅผ ํ์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉฐ ๋ฐ๋๋ฝ์ ๊ฑธ๋ฆด ์ ์๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ ์ Critical Section์ ๊ฑฐ๋ ์์ ์ด๋ค
๋ง์ฝ ์๋์ ๊ฐ์ด Critical Section์ ๊ฑธ์๋ค๊ณ ๊ฐ์ ํด๋ณด์
EnterCriticalSection(&gh_sum_lock);
if(IsPrime(i)) *p_data->p_sum += i;
LeaveCriticalSection(&gh_sum_lock);๊ฐ์ฅ ๋ถํ๊ฐ ํฐ ๊ตฌ๊ฐ์ด IsPrime์ ๊ตฌํ๋ ๊ตฌ๊ฐ์ธ๋ฐ ๊ฑฐ๊ธฐ์ CriticalSection์???
์ ๋ง ์ฑ๋ฅ์ด ๋จ์ด์ง๋ ์ฝ๋๊ฐ ๋ ๊ฒ์ด๋ค.