728x90
윈도우에서의 쓰레드 생성
- CreateThread : 성공 시 쓰레드 핸들, 실패 시 NULL 반환
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 핸들 상속 여부 결정
SIZE_T dwStackSize, // 독립 stack의 크기(기본 1MB)
LPTHREAD_START_ROUTINE lpStartAddress, // 쓰레드로 동작하기 위한 함수(쓰레드 main)
LPVOID lpParameter, // 쓰레드 함수에 전달할 인자
DWORD dwCreationFlags, // 생성 옵션
LPDWORD lpThreadId // 쓰레드 ID
);
- _beginthreadex : 성공 시 쓰레드 핸들, 실패 시 0 반환
-> ANSI 표준 C라이브러리는 쓰레드 기반에 안정적이지 않음
-> 동시접근 문제
-> _beginthreadex는 내부적으로 createThread 함수를 호출해주고 쓰레드별로 별도의 메모리 공간을 할당
-> createThread 함수 호출을 통해 생성되는 쓰레드는 C/C++ 표준 함수에 대해 안정적으로 동작하지 않음
-> createThread 함수와 매개 변수는 같음
#include <process.h>
uintptr_t _beginthreadex(void *_Security,
unsigned _StackSize,
unsigned (void *),
void *_ArgList,
unsigned _InitFlag,
unsigned *_ThrdAddr);
- 생성 가능한 쓰레드의 갯수
-> OS가 지정할 수 있고 상황에 따라 다름
-> 보편적으로 허용할 수 있는 만큼 생성 가능
#include <stdio.h>
#include <windows.h>
#include <process.h> /* _beginthreadex, _endthreadex */
unsigned ThreadFunc(void *arg);
unsigned int maxCnt = 0;
int main(int argc, char *argv[])
{
HANDLE hThread;
int param=5;
while(1) {
hThread=(HANDLE)_beginthreadex(NULL, 0, ThreadFunc, (void*)¶m, 0, &maxCnt);
if(hThread==0)
{
printf("Thread max cnt = %d\n",maxCnt);
return -1;
}
maxCnt++;
}
puts("end of main");
return 0;
}
unsigned ThreadFunc(void *arg)
{
int i;
int cnt=*((int*)arg);
for(i=0; i<cnt; i++)
{
puts("running thread");
}
return 0;
}
728x90
'Programming > Network' 카테고리의 다른 글
열혈 TCP/IP 20-1. 동기화 기법의 분류와 CRITICAL_SECTION 동기화 (0) | 2021.04.11 |
---|---|
열혈 TCP/IP 19-3. 커널 오브젝트의 두 가지 상태 (0) | 2021.04.11 |
열혈 TCP/IP 19-1. 커널오브젝트(Kernel Objects) (0) | 2021.04.11 |
열혈 TCP/IP 18-5. 쓰레드의 소멸과 멀티쓰레드 기반의 다중접속 서버의 구현 (0) | 2021.03.28 |
열혈 TCP/IP 18-4. 쓰레드 동기화 (0) | 2021.03.28 |