쓰래드생성 ,_ beeginthreadex, _endthreadex 를 사용 CreateThread, ExitThread 사용 하지말기!
ansi 표준의 CreateThread, ExitThread 쓰래드 생성 함수들은 함수 내부에서 데이터를 저장하고 있을 경우
다른 쓰래드로 즉 CreateThread, ExitThread 로 생성해서 동일한 함수 내부에 데이터를 저장하고 있는 함수를 호출 할경우
메모리 공유가 발생해 의도치 않은 결과가 나오는데
쓰래드를 고려한 함수인 ,_ beeginthreadex, _endthreadex 은 각 함수마다 독립된 메모리 공간을 갖게 해줌으로써
이러한 문제점을 피할 수 있다
http://blog.naver.com/kki2406?Redirect=Log&logNo=80041209326
의 내용을 살짝 변경하여 올림
#include <windows.h>
#include <stdio.h>
#include <process.h>
#include <tchar.h>
#include <iostream>
unsigned counter;
unsigned __stdcall SecondThreadFunc( void *pArg )
{
_tprintf(_T(" * In second thread... \n") );
while(1)
{
std::cout<<"쓰래드 실행중"<<std::endl;
_endthreadex(0); //쓰래드를 도중에 종료하는 구문으로 주석처리하면 루프가 무한히 돈다
}
return 0;
}
int main()
{
HANDLE hThread;
unsigned threadID;
_tprintf( _T(" * Creating second thread... \n ") );
hThread = (HANDLE) _beginthreadex(NULL, 0, SecondThreadFunc, NULL, 0, &threadID );
WaitForSingleObject( hThread, INFINITE );
_tprintf( _T(" * Counter should be 1000000; it is -> %d\n"), counter );
CloseHandle( hThread ); //_endthreadex 안에서 CloseHandle 이 불려지지 않음으로 직접 명시해야한다
return 0;
}
이 _beginthreadex 함수는 내부적으로 CreateThread 함수를 호출하고 있다.
이를 보고 싶다면 MS사에서 제공하는 코드를 직접 보면 될 것이다.
이 코드 파일은 첨부토록 하겠다. _beginthreadex 함수를 찾아보면 알 것이다.
또한, thread 생성과 파괴시 다음과 같은 함수들이 존재한다.
학습 : CreateThread(), ExitThread()
C Library + API : _beginthreadex(), _endthreadex();
MFC : AfxBeginThread(), AfxEndThread();
C++에서 멤버함수를 스레드로 이용시
#pragma comment (lib, "ws2_32.lib")
#include <stdio.h>
class a{
UINT WINAPI a::aaa(void *arg) { return 0;
int main() return 0; |
'운영체제 & 병렬처리 > Multithread' 카테고리의 다른 글
유저모드 동기화 VS 커널모드 동기화 (0) | 2012.11.01 |
---|---|
동기화(접근동기화, 순서 동기화), 임계영역 (0) | 2012.11.01 |
프로세스 환경변수(자식 프로세스에서 부모의 핸들값으로부터 등록된 값 가져오기) (0) | 2012.11.01 |
IPC(inter-process communication) 프로세스간의 통신 (0) | 2012.11.01 |
부모 자식의 관계로 엮여 있는 프로세스, [커널 오브젝트와 핸들의 종속관계] (0) | 2012.11.01 |