并发编程实验一

#include <bits/stdc++.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
#include <error.h>
#include <sys/times.h>
using namespace std;
#define Producer 2
#define Customer 2
#define BufferSize 5
#define Threadnum 5
int Buffer[BufferSize];
pthread_t threads[Customer+Producer];
//the model of Customer
sem_t canuseBuffers;//the messagebuffer free
sem_t canuseProduct;
pthread_mutex_t Mutex;
int Point_in=0;
int Point_out=0;
int Customer_id = 0;
int Producer_id = 0;
void * Custome(void *args)
{
    long num = (long)args;
    while(1)
    {
        sem_wait(&canuseProduct);//-- it
        pthread_mutex_lock(&Mutex);
        printf("pthread %d began to read!\n",num);
        Customer_id=Buffer[Point_out];//get a product
        Point_out = (Point_out+1)%BufferSize;
        sem_post(&canuseBuffers);//++ it
        pthread_mutex_unlock(&Mutex);
        printf("thread read over\n");
        sleep(1);
    }
    return NULL;
}
void * Produce(void *args)
{
    long num = (long)args;
    while(1)
    {
        sem_wait(&canuseBuffers);//--it
        pthread_mutex_lock(&Mutex);
        printf("pthread  %d began to write\n",num);
        sem_post(&canuseProduct);//++it
        pthread_mutex_unlock(&Mutex);
        sleep(5);
    }
    return NULL;
}
int main()
{
    sem_init(&canuseBuffers,0,BufferSize);
    sem_init(&canuseProduct,0,0);
    pthread_mutex_init(&Mutex,NULL);
    for(int i=0;i<Customer;i++)
    {
        int rc = 0;
        rc = pthread_create(&threads[i],NULL,Custome,(void *)i);
        if(rc)
        {
            printf("Error\n");
        }
        printf("thread %d are request read\n",i);
    }
    for(int i=0;i<Customer+Producer;i++)
    {
        int rc = 0;
        rc = pthread_create(&threads[i],NULL,Produce,(void *)i);
        if(rc)
        {
            printf("Error!\n");
        }
        printf("thread %d are request write\n",i);
    }
    for(int i=0;i<Customer+Producer;i++)
    {
        pthread_join(threads[i],NULL);
    }
}

猜你喜欢

转载自www.cnblogs.com/masterchd/p/9129842.html