Last active
May 13, 2020 16:25
-
-
Save deeev-sb/5fa6847713a292a1205611450be9fc3e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <pthread.h> | |
void *producer(void *); | |
void *consumer(void *); | |
#define MAX_BUF 100 | |
//shared variables | |
int buffer[MAX_BUF]; // 100개 integer를 담을 수 있는 buffer (공유 자원) | |
int count = 0; | |
int in = -1, out = -1; | |
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; | |
pthread_cond_t buffer_has_space = PTHREAD_COND_INITIALIZER; // buffer 공간 (producer는 buffer에 공간이 있을 때까지 wait) | |
pthread_cond_t buffer_has_data = PTHREAD_COND_INITIALIZER; // buffer 내 data (consumer는 buffer 안에 data가 있을 때까지 wait) | |
int main(void) | |
{ | |
int i; | |
pthread_t threads[2]; // 2개의 thread 생성 (1개는 producer, 1개는 consumer) | |
pthread_create(&threads[0], NULL, producer, NULL); | |
pthread_create(&threads[1], NULL, consumer, NULL); | |
for (i = 0; i < 2; i++) | |
pthread_join(threads[i], NULL); | |
return 0; | |
} | |
void *producer(void *v) // producer thread의 작업에 대한 함수 | |
{ | |
int i; | |
for (i = 0; i < 1000; i++) | |
{ | |
pthread_mutex_lock(&mutex); // 공유 자원에 접근하기 위해 mutex lock을 가져옴 | |
if (count == MAX_BUF) // buffer full ! | |
pthread_cond_wait(&buffer_has_space, &mutex); | |
/* buffer에 쓸 공간이 있을 경우 data를 씀 */ | |
in = in++ % MAX_BUF; | |
buffer[in] = i; // simple data | |
count++; // count로 buffer를 얼마나 썼는지 확인 | |
pthread_cond_signal(&buffer_has_data); // data가 buffer에 있다는 signal을 consumer에게 전달 | |
pthread_mutex_unlock(&mutex); // lock 해제 | |
} | |
} | |
void *consumer(void *v) // consumer thread의 작업에 대한 함수 | |
{ | |
int i, data; | |
for (i = 0; i < 1000; i++) | |
{ | |
pthread_mutex_lock(&mutex); | |
if (count == 0) // buffer empty ! | |
pthread_cond_wait(&buffer_has_data, &mutex); // data가 있다는 signal이 올 때까지 wait | |
/* buffer에 data가 있을 경우 data를 가져와서 사용 */ | |
out = out++ % MAX_BUF; | |
data = buffer[out]; | |
count--; // data를 buffer에서 꺼냈으므로 count 감소 | |
pthread_cond_signal(&buffer_has_space); // buffer 공간이 생겼다는 signal 전달 | |
pthread_mutex_unlock(&mutex); // lock 해제 | |
printf("data = %d\n", data); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment