Skip to content

Instantly share code, notes, and snippets.

@deeev-sb
Last active May 13, 2020 16:25
Show Gist options
  • Save deeev-sb/5fa6847713a292a1205611450be9fc3e to your computer and use it in GitHub Desktop.
Save deeev-sb/5fa6847713a292a1205611450be9fc3e to your computer and use it in GitHub Desktop.
#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