#include <iostream>
#include <Windows.h>
#include <process.h>
unsigned long test_int = 0;
void ThreadLoop(int number)
{
for(int i = 0; i < number; ++i)
{
// 변수의 증가를 안전하게 보장한다.
InterlockedIncrement(&test_int);
std::cout << "Thread For : " << test_int << std::endl;
}
}
unsigned int WINAPI Thread_Function_One(void *avg)
{
std::cout << "Thread One Start" << std::endl;
ThreadLoop(10);
std::cout << "Thread One End" << std::endl;
return test_int;
}
unsigned int WINAPI Thread_Function_Two(void *avg)
{
std::cout << "Thread Two Start" << std::endl;
ThreadLoop(10);
std::cout << "Thread Two End" << std::endl;
return test_int;
}
void main()
{
HANDLE thread_handle[2];
DWORD thread_one_id;
DWORD thread_two_id;
thread_handle[0] = (HANDLE)_beginthreadex(NULL, 0, Thread_Function_One, NULL, 0,
(unsigned*)&thread_one_id);
if(thread_handle[0] == 0)
{
std::cout << "_beginthreades Error" << std::endl;
}
else
{
std::cout << "Create Thread One" << std::endl;
}
thread_handle[1] = (HANDLE)_beginthreadex(NULL, 0, Thread_Function_Two, NULL, 0,
(unsigned*)&thread_two_id);
if(thread_handle[1] == 0)
{
std::cout << "_beginthreades Error" << std::endl;
}
else
{
std::cout << "Create Thread Two" << std::endl;
}
WaitForMultipleObjects(2, thread_handle, TRUE, INFINITE);
std::cout << "Main Exit" << std::endl;
}
Interlocked 함수를 통해 증가를 시키면 안전하게 다른 쓰레드에서 접근하지 못하고 증가시킬 수 있게 한다.
Interlocked 함수들
LONG __cdecl InterlockedIncrement( __inout LONG volatile *Addend ); | Addend 주소의 값을 하나 증가시킨 후 그 값을 반환하는 함수 |
LONG __cdecl InterlockedDecrement( __inout LONG volatile *Addend ); | Addend 주소의 값을 하나 감소시킨 후 그 값을 반환하는 함수 |
LONG __cdecl InterlockedExchange( __inout LONG volatile *Target, __in LONG Value ); | Value 값을 Target 주소으 내용으로 기록, 원래 값을 반환하는 함수 |
'Programming > C++' 카테고리의 다른 글
Critical_Section 예제 (0) | 2013.02.20 |
---|---|
멀티 쓰레드의 문제 (0) | 2012.11.29 |
_beginthreadex() 예제 (0) | 2012.11.22 |