• 生产者消费者模型


    互斥锁,条件变量实现:
    1 #include<stdio.h> 2 #include<sys/wait.h> 3 #include<unistd.h> 4 #include<stdlib.h> 5 #include<sys/types.h> 6 #include<sys/stat.h> 7 #include<string.h> 8 #include<sys/socket.h> 9 //#include<iostream> 10 #include<fcntl.h> 11 #include<sys/mman.h> 12 #include<pthread.h> 13 #include<signal.h> 14 15 //using namespace std; 16 17 //创建一个节点的结构 18 typedef struct node 19 { 20 int data; 21 struct node*next; 22 }Node; 23 24 //先定义出来一个头指针 25 Node* head = NULL; 26 27 //线程同步需要条件锁,互斥锁 28 pthread_mutex_t mutex; 29 pthread_cond_t cond; 30 31 32 void * producer(void * arg){ 33 while(1){ 34 Node* p = (Node*)malloc(sizeof(Node)); 35 //节点的初始化 36 p->data = rand()%1000;//0~99 37 38 //使用胡吃锁保护共享数据 39 pthread_mutex_lock(&mutex); //指针域 42 p->next = head; 43 head = p; 44 //cout<<"chuang jian :"<<pthread_self()<<p->data<<endl; 45 printf("chuang jian :%lu, data :%d ",pthread_self(),p ->data); 46 47 pthread_mutex_unlock(&mutex); 48 49 //通知阻塞的消费者线程,解除阻塞 50 pthread_cond_signal(&cond); 51 52 sleep(rand()%3); 53 } 54 return NULL; 55 } 56 57 void customer(void * arg){ 58 while(1){ 59 60 pthread_mutex_lock(&mutex); 61 62 //判断链表是否为空 63 if(head == NULL){ 64 //线程阻塞色-对胡吃锁解锁 65 pthread_cond_wait(&cond,&mutex); 66 //解除则色之后,会对胡吃锁在做枷锁 67 } 68 69 //链表不为空,删除一个节点 70 Node* pdel = head; 71 head = head->next; 72 //cout<<"shan chu :"<<pthread_self()<<pdel->data<<endl; 73 printf("xiao fei :%lu, data :%d ",pthread_self(),pdel ->data); 74 free(pdel); 75 pthread_mutex_unlock(&mutex); 76 } 77 return NULL; } int main(int argc,const char* argv[]){ 81 82 //创建生产者线程: 83 pthread_mutex_init(&mutex,NULL); 84 pthread_cond_init(&cond,NULL); 85 86 87 pthread_t p1; 88 pthread_t p2; 89 90 pthread_create(&p1,NULL,producer,NULL); 91 //创建消费者线程 92 pthread_create(&p2,NULL,customer,NULL); 93 94 //阻塞回收 95 pthread_join(&p1,NULL); 96 pthread_join(&p2,NULL); 97 98 pthread_mutex_destroy(&mutex); 99 pthread_cond_destroy(&cond); 100 101 return 0; 102 }

      

    2、信号量实现消费者,生产者模型
    #include<stdio.h>
    #include<unistd.h>
    #include<stdlib.h>
    #include<sys/stat.h>
    #include<string.h>
    #include<pthread.h>
    #include<semaphore.h>
    
    sem_t producer_sem;
    sem_t customer_sem;
    
    typedef struct node{
    	int data;
    	struct node* next;
    }Node;
    
    Node* head = NULL;
    
    void * producer(void* arg){
    	while(1){
    		sem_wait(&producer_sem);
    		Node* node = (Node*)malloc(sizeof(Node));
    		node->data = rand()%1000;
    		node->next = head;
    		head = node;
    		printf("+++ 生产者:%lu, %d 
    ",pthread_self(),node->data);
    		sem_post(&customer_sem);
    		sleep(rand()%5);
    	}
    }
    
    void* customer(void* arg){
    	while(2){
    		sem_wait(&customer_sem);
    		Node * pdel = head;
    		head = head->next;
    		printf("----消费者:%lu , %d 
    ",pthread_self(),pdel->data);
    		free(pdel);
    		sem_post(&producer_sem);
    		sleep(rand()%5);
    	}
    }
    
    int main(int argc,char* argv[]){
    	pthread_t p1;
    	pthread_t p2;
    
    	sem_init(&producer_sem,0,4);
    	sem_init(&customer_sem,0,0);
    	
    	pthread_create(&p1,NULL,producer,NULL);
    	pthread_create(&p2,NULL,customer,NULL);
    
    	pthread_join(p1,NULL);
    	pthread_join(p2,NULL);
    
    	sem_destroy(&producer_sem);
    	sem_destroy(&customer_sem);
    
    	return 0;
    }
    

      

  • 相关阅读:
    修改ssh默认端口
    网络配置
    nginx 反向代理
    nginx web 服务
    小白日记22:kali渗透测试之提权(二)--抓包嗅探
    小白日记21:kali渗透测试之提权(一)--本地提权
    小白日记20:kali渗透测试之后渗透测试阶段(一)--上传工具
    小白日记19:kali渗透测试之选择和修改EXP
    小白日记18:kali渗透测试之缓冲区溢出实例(二)--Linux,穿越火线1.9.0
    小白日记17:kali渗透测试之缓冲区溢出实例-windows,POP3,SLmail
  • 原文地址:https://www.cnblogs.com/yjds/p/9061671.html
Copyright © 2020-2023  润新知