예제 코드 설명
- 하나의 스레드는 전역 변수 target을 계속 더해주고(target++), 다른 하나의 스레드는 target을 계속 빼주는(target--) 멀티 스레드 예제 코드입니다.
- 스레드 동기화(Thread Synchronization)없이 두 개의 스레드가 경쟁하는 구조입니다.
Windows
- OS : Windows 10
#include <windows.h> // WinAPI 사용
#include <stdio.h>
int target = 0;
int WINAPI addTarget(LPVOID param) { // 파라미터로 원래 LPVOID 타입을 사용하지만 void * 를 사용해도 같음
int limit = *(int *) param;
int i=0;
for (i=1; i<=limit; i++) {
printf("[ADD] target : %d\n", ++target);
}
return 0;
}
int WINAPI subtractTarget(LPVOID param) {
int limit = *(int *) param;
int i=0;
for (i=1; i<=limit; i++) {
printf("[SUBTRACT] target : %d\n", --target);
}
return 0;
}
int main() {
int threadId1;
int threadId2;
HANDLE threadHandle1;
HANDLE threadHandle2;
int param=100;
// 스레드 생성
threadHandle1 = CreateThread(NULL, 0, addTarget, ¶m, 0, &threadId1);
threadHandle2 = CreateThread(NULL, 0, subtractTarget, ¶m, 0, &threadId2);
Sleep(3000);
printf("target : %d\n", target);
return 0;
}
동기화를 안 했기 때문에 두 개의 스레드가 각자 돌아가면서 값을 출력한다.
- DWORD : typedef unsigned long DWORD;
- LPVOID : typedef void far * LPVOID;
- HANDLE : 스레드를 접근하기 위한 핸들러
- WaitForSingleObject()를 사용한 경우
Linux
- OS : Ubuntu 16.04 LTS
- GCC : 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.12)
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int target = 0;
void * addTarget(void * param)
{
int limit = *(int *) param;
int i=0;
for (i=1; i<=limit; i++) {
printf("[ADD] target : %d\n", ++target);
}
}
void * subtractTarget(void * param)
{
int limit = *(int *) param;
int i=0;
for (i=1; i<=limit; i++) {
printf("[SUBTRACT] target : %d\n", --target);
}
}
int main()
{
pthread_t add, sub;
int param = 100;
int add_id = pthread_create(&add, NULL, addTarget, ¶m);
// error handling, 정상적으로 생성되면 0 반환
if (add_id < 0)
{
perror("thread create error : ");
exit(0);
}
int sub_id = pthread_create(&sub, NULL, subtractTarget, ¶m);
if (sub_id < 0)
{
perror("thread create error : ");
exit(0);
}
sleep(3000);
printf("target : %d\n", target);
return 0;
}
- gcc 컴파일 시 -lpthread 옵션 추가
'운영체제' 카테고리의 다른 글
[운영체제] 프로세스와 스레드 (1) | 2024.09.18 |
---|