目标:1.5个读者,一个写者;
2.读者可以并行读,写者和读者必须互斥
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <semaphore.h>
sem_t sem_r,sem_w;
int Flags=0;
pthread_mutex_t mutex= PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void* reader(void*);
void* writer(void*);
int main(int argc,char** argv){
pthread_t sid_r[5],sid_w;
int rc1=0,rc2=0;
int res1,res2,i=0;
res1 = sem_init(&sem_r, 0, 5);
res2 = sem_init(&sem_w, 0, 1);
if (res1 != 0)
{
perror("Sem1 init failed");
exit(EXIT_FAILURE);
}
if (res2 != 0)
{
perror("Sem2 init failed");
exit(EXIT_FAILURE);
}
for(i=0;i<5;i++){
rc1=pthread_create(&sid_r[i],NULL,reader,NULL);
if(0!=rc1){
//printf("%s:%d\n",_func_,strerror(rc1));
printf("error threads1\n");
}
printf("creast %d reader\n ",i+1);
}
rc2=pthread_create(&sid_w,NULL,writer,NULL);
if(0!=rc2){
//printf("%s:%d\n",_func_,strerror(rc2));
printf("error threads2\n");
}
// pthread_join(sid_r,NULL);
pthread_join(sid_w,NULL);
pthread_mutex_destroy(&mutex);
sem_destroy(&sem_r);
sem_destroy(&sem_w);
printf("exit\n");
pthread_cond_destroy(&cond);
//exit(0);
return 0;
}
void* reader(void*arg ){
printf("enter reader\n");
sem_wait(&sem_w);
sem_wait(&sem_r);
pthread_mutex_lock(&mutex);
printf("call thread_reader \n");
pthread_mutex_unlock(&mutex);
sem_post(&sem_r);
sem_post(&sem_w);
sleep(1);
}
void* writer(void * arg){
printf("enter writer\n");
sem_wait(&sem_w);
pthread_mutex_lock(&mutex);
printf("call thread_writer \n");
pthread_mutex_unlock(&mutex);
sem_post(&sem_w);
sleep(1);
}
结果:
[root@localhost test.threads]# ./test
creast 1 reader
creast 2 reader
creast 3 reader
creast 4 reader
creast 5 reader
enter reader
call thread_reader
enter reader
call thread_reader
enter reader
call thread_reader
enter writer
call thread_writer
enter reader
call thread_reader
enter reader
call thread_reader
exit
说明:代码很粗糙,仅作学习线程使用,没有优化和修改。