/*
* 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 |