Prashanth L.A.
2023-10-30
void *producer(void *arg)
{
int i;
for (i = 0; i < loops; i++) {
Sem_wait(&empty);
Sem_wait(&mutex);
do_fill(i);
Sem_post(&mutex);
Sem_post(&full);
}
}
void *consumer(void *arg)
{
int tmp = 0;
while (tmp != -1) {
Sem_wait(&full);
Sem_wait(&mutex);
tmp = do_get();
Sem_post(&mutex);
Sem_post(&empty);
printf("%d\n", tmp);
}
}
void getforks() {
sem_wait(forks[left(p)]);
sem_wait(forks[right(p)]);
}
void putforks() {
sem_post(forks[left(p)]);
sem_post(forks[right(p)]);
}
typedef struct __Zem_t {
int value;
pthread_cond_t cond; // cond_signal(c), cond_wait(c, m)
pthread_mutex_t lock; // mutex_lock(m), mutex_unlock(m)
} Zem_t;
// can assume only called by one thread
void
Zem_init(Zem_t *z, int value) {
z->value = value;
// init lock and cond
}
void Zem_wait(Zem_t *z) {
// use semaphore definition as your guide
}
void Zem_post(Zem_t *z) {
// use semaphore definition as your guide
}