linux下线程同步

来源:互联网 发布:股票教学软件 编辑:程序博客网 时间:2024/05/15 10:40

这里我做的测试使用的模型是生产者消费者模型,分成两种情况

其一只有一个缓冲区,我们使用信号量即可,分成两个,empty  和full。当缓冲区有空时,则生产者生产,当缓冲区full时。消费者消费

#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<string.h>#include<semaphore.h>//生产者消费者模式,只有一个缓冲区,一个消费者一个生产者//使用信号量进行线程同步void* consumer(void* arg);void* producer(void* arg);int gBuffer=0;sem_t empty={0};sem_t full={0};int main(){pthread_t c_th={0};pthread_t p_th={0};int c_res=0;int p_res=0;sem_init(&empty,0,1);sem_init(&full,0,0);c_res=pthread_create(&c_th,NULL,consumer,(void*)&gBuffer);if(0!=c_res){printf("消费者线程创建失败\n");exit(0);}p_res=pthread_create(&p_th,NULL,producer,(void*)&gBuffer);if(0!=p_res){printf("生产者线程创建失败\n");exit(0);}void* c_rtl=NULL;c_res=pthread_join(c_th,&c_rtl);if(0!=c_res){printf("消费者线程 pthread_join 失败\n");exit(0);}void* p_rtl=NULL;p_res=pthread_join(p_th,&p_rtl);if(0!=p_res){printf("生产者 pthread_join 失败\n");exit(0);}sem_destroy(&full);sem_destroy(&empty);return 0;}void * consumer(void* arg){int nCount=0;while(1){sem_wait(&full);printf("consumer 成功\n");sem_post(&empty);nCount++;if(50==nCount)break;}pthread_exit(0);}void * producer(void* arg){int nCount=0;while(1){sem_wait(&empty);printf("producer 成功\n");sem_post(&full);nCount++;if(50==nCount)break;}pthread_exit(0);}

当存在多个缓冲区的时候,则除却信号量标记,缓冲区状态的时候,还要为每个缓冲区分配互斥变量,同一时刻,一个缓冲区只能被一个线程访问,无论是生产者还是消费者

#include<stdio.h>#include<stdlib.h>#include<pthread.h>#include<string.h>#include<semaphore.h>//生产者消费者模式,多个缓冲区,多个生产者//使用信号量进行线程同步void* consumer(void* arg);void* producer(void* arg);int gBuffer[4]={0};int buf_count=4;//为每个缓冲区都准备一个互斥变量,同一时间只能有一个线程进行访问pthread_mutex_t mutex[4]={0};sem_t empty={0};sem_t full={0};int main(){pthread_t c_th={0};pthread_t p_th={0};int c_res=0;int p_res=0;sem_init(&empty,0,4);sem_init(&full,0,0);int i=0;for(;i<buf_count;i++){pthread_mutex_init(&mutex[i],NULL);}c_res=pthread_create(&c_th,NULL,consumer,(void*)&gBuffer);if(0!=c_res){printf("消费者线程创建失败\n");exit(0);}p_res=pthread_create(&p_th,NULL,producer,(void*)&gBuffer);if(0!=p_res){printf("生产者线程创建失败\n");exit(0);}void* c_rtl=NULL;c_res=pthread_join(c_th,&c_rtl);if(0!=c_res){printf("消费者线程 pthread_join 失败\n");exit(0);}void* p_rtl=NULL;p_res=pthread_join(p_th,&p_rtl);if(0!=p_res){printf("生产者 pthread_join 失败\n");exit(0);}sem_destroy(&full);sem_destroy(&empty);for(i=0;i<buf_count;i++){pthread_mutex_destroy(&mutex[i]);}return 0;}void * consumer(void* arg){int nCount=0;int i=0;while(nCount<=20){sem_wait(&full);for(i=0;i<buf_count;i++){if(1==gBuffer[i]){pthread_mutex_lock(&mutex[i]);gBuffer[i]=0;printf("缓冲区%d归0\n",i);pthread_mutex_unlock(&mutex[i]);sem_post(&empty);nCount++;}}}pthread_exit(0);}void * producer(void* arg){int nCount=0;int i=0;while(nCount<=20){sem_wait(&empty);for(i=0;i<buf_count;i++){if(gBuffer[i]==0){pthread_mutex_lock(&mutex[i]);gBuffer[i]=1;printf("缓冲区%d置位\n",i);pthread_mutex_unlock(&mutex[i]);sem_post(&full);nCount++;}}}pthread_exit(0);}

跟上一篇一样,说下 makefile的内容,多了一个  -lrt

test: thread.ogcc -o test thread.o  -lpthread  -lrtthread.o:thread.cgcc -c thread.cclean:rm test *.o



0 0
原创粉丝点击