[OS] C로 Multi-thread(멀티 스레드) 구현 1 (Windows / Linux)

·2020년 10월 21일
0

예제 코드 설명

  • 하나의 스레드는 전역 변수 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, &param, 0, &threadId1);
	threadHandle2 = CreateThread(NULL, 0, subtractTarget, &param, 0, &threadId2);
	
	Sleep(3000);
	printf("target : %d\n", target);
    return 0;
}


동기화를 안 했기 때문에 두 개의 스레드가 각자 돌아가면서 값을 출력한다.

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, &param);
  // error handling, 정상적으로 생성되면 0 반환
  if (add_id < 0)
  {
      perror("thread create error : ");
      exit(0);
  }
  
  int sub_id = pthread_create(&sub, NULL, subtractTarget, &param);
  if (sub_id < 0)
  {
      perror("thread create error : ");
      exit(0);
  }
 
  sleep(3000);
  printf("target : %d\n", target);
 
  return 0;
}

  • gcc 컴파일 시 -lpthread 옵션 추가
profile
https://devhdong.tistory.com 로 이전되었습니다.

0개의 댓글