zoukankan      html  css  js  c++  java
  • 生产消费者的同步

    
    

     生产者消费者

        生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。

    转自  http://www.cnblogs.com/svitter/p/4006129.html
    1
    /*============================================================================= 2 # 3 # Author: svtter - svtter@qq.com 4 # 5 # QQ : 57180160 6 # 7 # Last modified: 2014-10-03 20:35 8 # 9 # Filename: producer_consumer.cc 10 # 11 # Description: 12 # 13 =============================================================================*/ 14 #include <cstdio> 15 #include <unistd.h> 16 #include <semaphore.h> 17 #include <pthread.h> 18 #include <sys/types.h> 19 #include <stdlib.h> 20 #include <iostream> 21 22 using namespace std; 23 24 #define N 5 25 #define item int 26 27 // P/V操作 28 void P(sem_t* sem) 29 { 30 if(sem_wait(sem)) 31 perror("P error!"); 32 33 } 34 35 void V(sem_t* sem) 36 { 37 if(sem_post(sem)) 38 perror("V error!"); 39 } 40 41 sem_t mutex; 42 sem_t full; 43 sem_t empty; 44 item buffer[N]; 45 int i = 0, j = -1; 46 47 void init_sem() 48 { 49 sem_init(&mutex, 0, 1); 50 sem_init(&full, 0, 0); 51 sem_init(&empty, 0, N); 52 } 53 54 void* producer(void *arg) 55 { 56 int product; 57 while(1) 58 { 59 //生成随机数字 60 product = rand()%100; 61 // cout << "producer running..." << endl; 62 P(&empty); 63 P(&mutex); 64 buffer[i] = product; 65 printf("producer produced %d @ %d pos ", 66 product, i); 67 i=(i+1)%N; 68 V(&mutex); 69 V(&full); 70 sleep(1); 71 } 72 } 73 74 void* consumer(void *arg) 75 { 76 int product, temp; 77 while(1) 78 { 79 // cout << "consumer running..." << endl; 80 P(&full); 81 P(&mutex); 82 j = (j+1)%N; 83 product = buffer[j]; 84 V(&mutex); 85 V(&empty); 86 printf("Consumer consumed %d @ %d pos ", 87 product, j); 88 sleep(3); 89 } 90 } 91 92 int main() 93 { 94 //random num 95 srand(time(NULL)); 96 init_sem(); 97 98 int error; 99 pthread_t producer_t, consumer_t; 100 101 error = pthread_create(&producer_t, NULL, producer, NULL); 102 if(error != 0) 103 printf("error in create producer. "); 104 else 105 printf("create producer success! "); 106 107 pthread_create(&consumer_t, NULL, consumer, NULL); 108 if(error != 0) 109 printf("error in create consumer. "); 110 else 111 printf("create consumer success! "); 112 113 pthread_join(producer_t, NULL); 114 pthread_join(consumer_t, NULL); 115 116 return 0; 117 }

     Java:

     class Producer implements Runnable {  
     
        private String producerName = null; 
     
        private StoreHouse storeHouse = null; 
     
        public Producer(String producerName, StoreHouse storeHouse) { 
            this.producerName = producerName; 
            this.storeHouse = storeHouse; 
        } 
     
        public void setProducerName(String producerName) { 
            this.producerName = producerName; 
        } 
     
        public String getProducerName() { 
            return producerName; 
        } 
         
        public void produceProduct() { 
            int i = 0; 
            while (true) { 
                i++; 
                Product pro = new Product(i); 
                storeHouse.push(pro); 
                System.out.println(getProducerName() + " 生产了 " + pro); 
                try { 
                    Thread.sleep(2000); 
                } catch (InterruptedException e) { 
                    return; 
                } 
            } 
        } 
     
        public void run() { 
            produceProduct(); 
        } 
     


    class Consumer implements Runnable { 
         
        private String consumerName = null; 
         
        private StoreHouse storeHouse = null; 
     
        public Consumer(String consumerName, StoreHouse storeHouse) { 
            this.consumerName = consumerName; 
            this.storeHouse = storeHouse; 
        } 
         
        public void setConsumerName(String consumerName) { 
            this.consumerName = consumerName; 
        } 
         
        public String getConsumerName() { 
            return consumerName; 
        } 
         
        public void consumerProduct() { 
            while (true) { 
                System.out.println(getConsumerName() + " 消费了 " + storeHouse.pop()); 
                try { 
                    Thread.sleep(5000); 
                } catch (InterruptedException e) { 
                    return; 
                } 
            } 
        } 
     
        public void run() { 
            consumerProduct(); 
        } 
     



     
    class Product { 
     
        private int productId = 0; 
         
        public Product(int productId) { 
            this.productId = productId; 
        } 
     
        public int getProductId() { 
            return productId; 
        } 
     
        public String toString() { 
            return Integer.toString(productId); 
        } 


    class StoreHouse { 
     
        private int base = 0; 
     
        private int top = 0; 
     
        private Product[] products = new Product[10]; 
     
        public synchronized void push(Product product) { 
            while (top == products.length) { 
                notify(); 
                try { 
                    System.out.println("仓库已满,正等待消费..."); 
                    wait(); 
                } catch (InterruptedException e) { 
                    System.out.println("stop push product because other reasons"); 

                } 
            } 
            products[top] = product; 
            top++; 
        } 
     
        public synchronized Product pop() { 
            Product pro = null; 
            while (top == base) { 
                notify(); 
                try { 
                    System.out.println("仓库已空,正等待生产..."); 
                    wait(); 
                } catch (InterruptedException e) { 
                    System.out.println("stop push product because other reasons"); 

                } 
            } 
            top--; 
            pro = products[top]; 
            products[top] = null; 
            return pro; 
        } 


    public class TestPC { 
        public static void main(String[] args) { 
            StoreHouse storeHouse = new StoreHouse(); 
            Producer producer = new Producer("生产者", storeHouse); 
            Consumer comsumer = new Consumer("消费者", storeHouse); 
            Thread t1 = new Thread(producer); 
            Thread t2 = new Thread(comsumer); 
            t1.start(); 
            t2.start(); 
        } 
  • 相关阅读:
    Idea导出jar包运行报错:找不到主清单属性解决方法
    Java开发桌面程序学习(一)——JavaFx+Jfoenix初始以及搭建
    JavaFx出现错误Caused by: java.lang.NullPointerException: Location is required的解决方法
    IDEA maven设置配置
    oracle学习笔记(十九) 子程序——存储过程
    ASP.NET Core 指定环境发布(hosting environment)
    解决Visual Studio 2017隐藏“高级保存选项”命令
    【亲测可用,亦可配置同一平台的不同账号,例如阿里云的两个不同账号】Windows下Git多账号配置,同一电脑多个ssh-key的管理
    Xshell5 评估过期,需要采购,不能使用
    linux上mongodb的安装与卸载
  • 原文地址:https://www.cnblogs.com/luoquan/p/4894580.html
Copyright © 2011-2022 走看看