#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t mutex, wrt;
int readcount = 0;
int data = 0;
void* reader(void* arg)
{
int id = *(int*)arg;
sem_wait(&mutex);
readcount++;
if(readcount == 1)
sem_wait(&wrt);
sem_post(&mutex);
printf("Reader %d reads data = %d\n", id
, data
); sleep(1);
sem_wait(&mutex);
readcount--;
if(readcount == 0)
sem_post(&wrt);
sem_post(&mutex);
return NULL;
}
void* writer(void* arg)
{
int id = *(int*)arg;
sem_wait(&wrt);
data++;
printf("Writer %d writes data = %d\n", id
, data
); sleep(1);
sem_post(&wrt);
return NULL;
}
int main()
{
pthread_t r[3], w[2];
int r_id[3] = {1,2,3};
int w_id[2] = {1,2};
sem_init(&mutex, 0, 1);
sem_init(&wrt, 0, 1);
for(int i = 0; i < 3; i++)
pthread_create(&r[i], NULL, reader, &r_id[i]);
for(int i = 0; i < 2; i++)
pthread_create(&w[i], NULL, writer, &w_id[i]);
for(int i = 0; i < 3; i++)
pthread_join(r[i], NULL);
for(int i = 0; i < 2; i++)
pthread_join(w[i], NULL);
sem_destroy(&mutex);
sem_destroy(&wrt);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgpzZW1fdCBtdXRleCwgd3J0OwppbnQgcmVhZGNvdW50ID0gMDsKaW50IGRhdGEgPSAwOwp2b2lkKiByZWFkZXIodm9pZCogYXJnKQp7CiAgICBpbnQgaWQgPSAqKGludCopYXJnOwogICAgc2VtX3dhaXQoJm11dGV4KTsKICAgIHJlYWRjb3VudCsrOwogICAgaWYocmVhZGNvdW50ID09IDEpCiAgICAgICAgc2VtX3dhaXQoJndydCk7CiAgICBzZW1fcG9zdCgmbXV0ZXgpOwogICAgcHJpbnRmKCJSZWFkZXIgJWQgcmVhZHMgZGF0YSA9ICVkXG4iLCBpZCwgZGF0YSk7CiAgICBzbGVlcCgxKTsKICAgIHNlbV93YWl0KCZtdXRleCk7CiAgICByZWFkY291bnQtLTsKICAgIGlmKHJlYWRjb3VudCA9PSAwKQogICAgICAgIHNlbV9wb3N0KCZ3cnQpOwogICAgc2VtX3Bvc3QoJm11dGV4KTsKICAgIHJldHVybiBOVUxMOwp9CnZvaWQqIHdyaXRlcih2b2lkKiBhcmcpCnsKICAgIGludCBpZCA9ICooaW50Kilhcmc7CiAgICBzZW1fd2FpdCgmd3J0KTsKICAgIGRhdGErKzsKICAgIHByaW50ZigiV3JpdGVyICVkIHdyaXRlcyBkYXRhID0gJWRcbiIsIGlkLCBkYXRhKTsKICAgIHNsZWVwKDEpOwogICAgc2VtX3Bvc3QoJndydCk7CiAgICByZXR1cm4gTlVMTDsKfQppbnQgbWFpbigpCnsKICAgIHB0aHJlYWRfdCByWzNdLCB3WzJdOwogICAgaW50IHJfaWRbM10gPSB7MSwyLDN9OwogICAgaW50IHdfaWRbMl0gPSB7MSwyfTsKICAgIHNlbV9pbml0KCZtdXRleCwgMCwgMSk7CiAgICBzZW1faW5pdCgmd3J0LCAwLCAxKTsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspCiAgICAgICAgcHRocmVhZF9jcmVhdGUoJnJbaV0sIE5VTEwsIHJlYWRlciwgJnJfaWRbaV0pOwogICAgZm9yKGludCBpID0gMDsgaSA8IDI7IGkrKykKICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmd1tpXSwgTlVMTCwgd3JpdGVyLCAmd19pZFtpXSk7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQogICAgICAgIHB0aHJlYWRfam9pbihyW2ldLCBOVUxMKTsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCAyOyBpKyspCiAgICAgICAgcHRocmVhZF9qb2luKHdbaV0sIE5VTEwpOwogICAgc2VtX2Rlc3Ryb3koJm11dGV4KTsKICAgIHNlbV9kZXN0cm95KCZ3cnQpOwoKICAgIHJldHVybiAwOwp9