반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 |
#include <stdio.h> //_ftprintf
#include <windows.h> //DWORD
#include <tchar.h> //TCHAR
#include <locale.h> //_tsetlocale
#include <process.h> //_beginthreadex
//#pragma once라는 애가 파일에 붙어있으면
// #ifndef 을 사용안한다. 왜냐.. 쟤는 한번만
// 포함을 하는 애라...
DWORD WINAPI ThreadProc(LPVOID lpParam);
int _tmain(void)
{
_tsetlocale(LC_ALL, _T("korean"));
DWORD dwThreadID[3];
HANDLE hThread[3]; //커널오브젝트를 사용하나보다
DWORD lParam[] = {1,3,4,7,8,10};
hThread[0] = CreateThread(
NULL,
0,
ThreadProc,
(LPVOID)&lParam[0],
0,
&dwThreadID[0]);
hThread[1] = CreateThread(
NULL,
0,
ThreadProc,
(LPVOID)&lParam[2],
0,
&dwThreadID[1]);
hThread[2] = CreateThread(
NULL,
0,
ThreadProc,
(LPVOID)&lParam[4],
0,
&dwThreadID[2]);
//커널 오브젝트 상태가 signal 될때까지 기다려줌
//쓰레드일 경우에는 종료가 될때 signal 로 상태가 바뀐다.
//세개의 쓰레드가 다 종료가 되어 다 signal이 되면
//그 다음문장을 실행한다. 그때까지는 기다려준다.
WaitForMultipleObjects(3, hThread, TRUE, INFINITE);
int total = 0;
GetExitCodeThread(hThread[0], (DWORD*)&total);
int result = -1;
GetExitCodeThread(hThread[1], (DWORD*)&result);
total += result;
GetExitCodeThread(hThread[2], (DWORD*)&result);
total += result;
_ftprintf(stdout, _T("total = %d\n"), total);
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
CloseHandle(hThread[2]);
return 0;
}
//HIWORD,LOWORD
//LPVOID 는 어떤 데이터형에 대해서도 받을 수 있다는 거고
//데이터를 하나만 받을 수도 있지만, 여러개도 받을 수 있다는 뜻입니다.
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
DWORD result = 0;
DWORD *ptr = (DWORD*)lpParam;
DWORD one = *ptr;
DWORD two = *(ptr + 1);
for (DWORD i = one; i <= two; i++)
result += i;
return result;
} |
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 |
#include <stdio.h> //_ftprintf
#include <windows.h> //DWORD
#include <tchar.h> //TCHAR
#include <locale.h> //_tsetlocale
#include <process.h> //_beginthreadex
//#pragma once라는 애가 파일에 붙어있으면
// #ifndef 을 사용안한다. 왜냐.. 쟤는 한번만
// 포함을 하는 애라...
//fscanf_s
unsigned int WINAPI ThreadProc(LPVOID lpParam);
int _tmain(void)
{
_tsetlocale(LC_ALL, _T("korean"));
unsigned int dwThreadID[3];
HANDLE hThread[3]; //커널오브젝트를 사용하나보다
DWORD lParam[] = { 1,3,4,7,8,10 };
//(HANDLE) 는 타입(데이터형)을 형변환하는 키워드
//static_cast<HANDLE>(변수); 안전하게 형변환
hThread[0] = (HANDLE)_beginthreadex(
NULL,
0,
ThreadProc,
(LPVOID)&lParam[0],
0,
&dwThreadID[0]);
hThread[1] = (HANDLE)_beginthreadex(
NULL,
0,
ThreadProc,
(LPVOID)&lParam[2],
0,
&dwThreadID[1]);
hThread[2] = (HANDLE)_beginthreadex(
NULL,
0,
ThreadProc,
(LPVOID)&lParam[4],
0,
&dwThreadID[2]);
//커널 오브젝트 상태가 signal 될때까지 기다려줌
//쓰레드일 경우에는 종료가 될때 signal 로 상태가 바뀐다.
//세개의 쓰레드가 다 종료가 되어 다 signal이 되면
//그 다음문장을 실행한다. 그때까지는 기다려준다.
WaitForMultipleObjects(3, hThread, TRUE, INFINITE);
int total = 0;
GetExitCodeThread(hThread[0], (DWORD*)&total);
int result = -1;
GetExitCodeThread(hThread[1], (DWORD*)&result);
total += result;
GetExitCodeThread(hThread[2], (DWORD*)&result);
total += result;
_ftprintf(stdout, _T("total = %d\n"), total);
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
CloseHandle(hThread[2]);
return 0;
}
//HIWORD,LOWORD
//LPVOID 는 어떤 데이터형에 대해서도 받을 수 있다는 거고
//데이터를 하나만 받을 수도 있지만, 여러개도 받을 수 있다는 뜻입니다.
unsigned int WINAPI ThreadProc(LPVOID lpParam)
{
DWORD result = 0;
DWORD *ptr = (DWORD*)lpParam;
DWORD one = *ptr;
DWORD two = *(ptr + 1);
for (DWORD i = one; i <= two; i++)
result += i;
return result;
} |
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 |
#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#include <process.h>//_beginthreadex3
#include <windows.h> //HANDLE DWORD
int total; //얘는 전역변수,누구나 접근가능
void Increase(void);
HANDLE hMutex;
unsigned int WINAPI ThreadFunc(LPVOID);
int _tmain(void)
{
_tsetlocale(LC_ALL, _T("korean"));
//FALSE는 누구쓸수있게 signal로 하겠다는 거야
hMutex = CreateMutex(NULL,
FALSE, NULL);
HANDLE hThread[3];//커널오브젝트(상태를 저장하는 구조체,signal상태가 가장중요)
unsigned int dwThreadID[3];//쓰레드의 번호
for (int i = 0; i < 3; i++) {
hThread[i] = (HANDLE)_beginthreadex(
NULL,
0,
ThreadFunc,
NULL,
CREATE_SUSPENDED,
&dwThreadID[i]);
}
//SUSPEND는 작업관리자 혹은 커널의 스케쥴러에서도 인식하지못하는
//대기상태다 이게 RESULME 이라는 상태가 되어야지 ready 한다.
for (int i = 0; i < 3; i++)
ResumeThread(hThread[i]); //이때서의 ready가 되어 스케줄러가 인식
//HANDLE 즉 hThread의 커널오브젝트가 signal이 될때까지 기다린다.
//TRUE는 모든 쓰레드를 기다리겠다는 겁니다.
WaitForMultipleObjects(3, hThread, TRUE, INFINITE);
_ftprintf(stdout, _T("결과값은 %d\n"), total);
for (int i = 0; i < 3; i++)
CloseHandle(hThread[i]);
CloseHandle(hMutex);
return 0;
}
unsigned int WINAPI ThreadFunc(LPVOID lpParam)
{
for (int i = 0; i < 10000; i++)
Increase();
return 0;
}
void Increase(void)
{
//signal 상태를 기다린다.
//hMutex는 non-signal로 바로 바뀐다.
WaitForSingleObject(hMutex, INFINITE);
total++;
ReleaseMutex(hMutex);//키를 반납. hMutex를 signal로 만들어버림
} |
cs |
반응형
'프로그래밍 > 시스템' 카테고리의 다른 글
[윈도우 프로그래밍] 뮤텍스 크리티컬섹션 (0) | 2017.06.02 |
---|---|
[java-OracleDB] DB 우편번호 검색 로직 (0) | 2017.05.25 |
[윈도우 프로그래밍] 다이얼로그박스 만들기 (0) | 2017.05.19 |
[C] 확률 맞추기 프로그램 (0) | 2017.05.18 |
[java] 문자 ↔ 정수 (변환) (0) | 2017.05.14 |