producer / consumer 를 구현하기 위해서는 기본적으로 pthread 를 이용한 병행
프로세스를 생성한다. main() thread 에서 pthread_create() 함수를 호출하여 2개의
새로운 thread(producer, consumer) 를 생성한다.
(pthread_join 함수는 지정된 thread가 pthread_exit 나 pthread_cancel 에 의해
종료되기를 기다린다. joinable thread 는 종료 되어도 시스템의 thread 관련 자원은 삭제되지 않고
pthread_join 에 의해 제거가 된다.)
main() thread 가 먼저 종료하면 형제관계에 있는 모든 thread가 강제 종료되기
때문에 pthread_join() 하여 두 thread가 종료되기를 기다린다.
☑ producer thread
☀ 소문자를 노드에 저장시키기 위하여 소문자가 저장되어있는 파일을 오픈한다.
☀ 공유변수를 건들이기위해 mutex_lock 하여 임계구역 안으로 들어간다.
☀ 만일 count 가 100일때, 즉 노드의 수가 100개일때, consumer 스레드가
소비할수 있도록 잠시 unlock하고 자신은 wait 하게 된다.
consumer 스레드가 소비를 하고 wait 하고 있는 producer 스레드에게
signal을 보내어 wait에서 깨어나, lock을하고 임계구역을 진행한다.
☀ 노드를 생성하고 새로생성한 노드에 파일을 read 하여 소문자를 저장한다.
☀ 노드의 수를 증가시키기 위해 count++ 한다.
☀ consumer 스레드에게 signal을 보내 , 소비할 노드가 없어 wait 상태인
thread를 깨워주게 된다.
☀ mutex_unlock 하여 임계구역에서 빠져나오게 된다.
☑ consumer thread
☀ 공유변수를 건들이기위해 mutex_lock 하여 임계구역 안으로 들어간다.
☀ 만일 count가 0 이라면 소비할 노드가 없기 때문에 producer thread가
노드를 생산할수 있도록, 잠시 unlock하고 자신은 wait 하게 된다.
producer thread 가 노드를 생산하고 wait 하고 있는 consumer thread 에게
signal 을 보내어 wait에서 깨어나, lock을하고 임계구역을 진행한다.
☀ tail이 포인트 하고 있는 노드의 데이터를 out 에 저장한다.
☀ toupper() 를 이용하여, 소문자를 대문자로 변경후 저장한다.
☀ 노드를 삭제하고 count-- 하여 노드의 수를 감소 시킨다.
☀ producer 스레드에게 signal을 보내 , 노드의 수가 꽉차있어 wait 상태인
thread를 깨워주게 된다.
☀ mutex_unlock 하여 임계구역에서 빠져나오게 된다.
pthread_mutex.c
-
more..
댓글 없음:
댓글 쓰기