반응형

쓰래드생성 ,_ 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++ 멤버함수 beginthreadex  C/C++ / Programming 

2010/06/26 16:36

복사http://blog.naver.com/haruka7879/140109537378

C++에서 멤버함수를 스레드로 이용시

 

#pragma comment (lib, "ws2_32.lib")

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <process.h>   // _beginthreadex 함수 참조
#include <windows.h>

 

class a{
public:
    static UINT WINAPI aaa(void *arg);
};

 

UINT WINAPI a::aaa(void *arg)

{
    printf("[%s:%d]\n", __FILE__, __LINE__);

    return 0;
}

 

int main()
{
    HANDLE hThread;
    hThread = (HANDLE)_beginthreadex(NULL, 0, a::aaa, NULL, 0, NULL);
    WaitForSingleObject(hThread, 100);

    return 0;
}

반응형

+ Recent posts