본문 바로가기

프로그램언어/C++

리눅스용 뮤텍스(mutex) 사용 예제

/*
* Written by ccw.
* Date 2007. 02. 27. Tue pm. 4:53

 리눅스용

 뮤텍스(mutex)  사용 예제

 쓰레드가 호출하는 함수 루틴 내에서, 전역으로 선언된 변수 및 배열에
 접근하는 코드가 있다면, 그곳이 임계 지역으로 된다.
 임계 지역에 쓰레드의 동시 접근을 제한하기 위해서
 임계 지역의 시작 위치에 pthread_mutex_lock 함수 호출을
 임계 지역 끝나는 위치에서 pthread_mutex_unlock 함수 호출을 해주면 된다.
*/


#include "stdio.h"
#include "unistd.h"
#include "stdlib.h"
#include "pthread.h"

void* thread_increment(void *arg);
void ErrorHandling(char *message);


// 전역으로 잡았으므로 모든 쓰레드에서 값을 공유한다.

char thread1[] = "A Thread";
char thread2[] = "B Thread";

pthread_mutex_t mutx;

// 전역으로 잡혔으므로 쓰레드들이 동시에 접근할 수 있는 문제 생길수 있음
int number = 0;


int main(int argc, char** argv)
{
 pthread_t t1, t2;
 void* thread_result;
 int state;

 // 뮤텍스 초기화
 state = pthread_mutex_init(&mutx, NULL);
 
 if (state != 0) {
  ErrorHandling("pthread_mutex_init() error");
 }

 // 두개의 쓰레드 생성
 pthread_create(&t1, NULL, thread_increment, &thread1);
 pthread_create(&t2, NULL, thread_increment, &thread2);

 // 쓰레드 생성 완료 될 때까지 지연
 pthread_join(t1, &thread_result);
 pthread_join(t2, &thread_result);


 printf("최종 number : %d \n", number);
 
 // 뮤텍스 제거
 pthread_mutex_destroy(&mutx);

 return 0;
}



void ErrorHandling(char *message)
{
 fputs(message, stderr);
 fputc('\n',stderr);
 exit(1);
}


void* thread_increment(void *arg)
{
 int i;

 for (i=0; i<5;i++) {

  // 뮤텍스 락설정
  pthread_mutex_lock(&mutx);
 
  Sleep(1);

  // 임계지역 접근
  number++;

  printf("실행 : %s, number : %d \n", (char*)arg, number);

  // 뮤텍스 언락설정
  pthread_mutex_unlock(&mutx);

 }

}

 

'프로그램언어 > C++' 카테고리의 다른 글

make 강좌  (0) 2008.07.22
AutoTools  (0) 2008.07.22
[C++] 캐스트 연산자  (0) 2008.07.22
C++ 튜토리얼 소스  (0) 2008.07.22
STL Container  (0) 2008.07.22