#include<stdlib.h>
#include<unistd.h>
#include<semaphore.h>
#include<pthread.h>
#define PRODUCER 10//生产者数量
#define CONSUMER 8//消费者数量
#define BUFFER 20//缓冲区数量
sem_t empty,full//同步信号量
pthread_mutex_t mutex//互斥信号量
int buffer[BUFFER] //缓冲区
int producer_id=0,consumer_id=0//生产者消费者ID
int index_in=0,index_out=0//生产者 消费者 存放 消费的位置
void print()//输出缓冲区
{
int i
printf("Buffer:\n")
for(i=0i<20i++)
{
printf("___")
}
printf("\n")
for(i=0i<20i++)
printf("|%d|",buffer[i])
printf("\n")
for(i=0i<20i++)
{
printf("———")
}
printf("\n")
}
void *Producer()//生产者函数
{
int ID=++producer_id
while(1)
{
sleep(3)
sem_wait(&empty)
pthread_mutex_lock(&mutex)
index_in=index_in%BUFFER
printf("Producer %d in %d.\n",ID,index_in)
buffer[index_in]=1//缓冲区置0
print()//输出缓冲区情况
index_in++
pthread_mutex_unlock(&mutex)
sem_post(&full)
}
}
void *Consumer()//消费者函数
{
int ID=++consumer_id
while(1)
{
sleep(3)
sem_wait(&full)
pthread_mutex_lock(&mutex)
index_out=index_out%BUFFER
printf("\033[0134mConsumer %d in %d\033[0m\n",ID,index_out)
buffer[index_out]=0//缓冲区置0
print()//输出缓冲区情况
index_out++
pthread_mutex_unlock(&mutex)
sem_post(&empty)
}
}
int main()
{
//freopen("text.txt","w",stdout)
int rthread[18],i
pthread_t producer[PRODUCER]//生产者
pthread_t consumer[CONSUMER]//消费者
int sinit1=sem_init(&empty,0,BUFFER)//初始化同步信号量
int sinit2=sem_init(&full,0,0)
int minit =pthread_mutex_init(&mutex,NULL)//初始化互斥信号量
if(sinit1 && sinit2)
{
printf("sem initialize failed /n")
exit(1)
}
if(minit)
{
printf("sem initialize failed /n")
exit(1)
}
for(i=0i<PRODUCERi++)//创建生产者线程
{
rthread[i]=pthread_create(&producer[i], NULL, Producer, NULL)
if(rthread[i])
{
printf("producer %d create failed /n", i)
exit(1)
}
}
for(i=0i<CONSUMERi++)//创建消费者线程
{
rthread[i]=pthread_create(&consumer[i], NULL, Consumer,NULL)
if(rthread[i])
{
printf("consumer %d create failed /n", i)
exit(1)
}
}
for(i=0i<PRODUCERi++)//销毁生产者线程
{
pthread_join(producer[i],NULL)
}
for(i=0i<CONSUMERi++)//销毁生产者线程
{
pthread_join(consumer[i],NULL)
}
exit(0)
}
稍微修改了一点,好像没什么大问题。
#include <stdio.h>
#include <windows.h>
#define n 10 //缓冲区容量大小
typedef int semaphore//信号量
int in = 0, out = 0
semaphore mutex = 1, empty = n, full = 0, buffer[n], front = 0, rear = 0
void proceducer()
void consumer()
void wait(semaphore&pass) {// P操作
pass--
}
void signal(semaphore&release) {// V操作
release++
}
void produce_item(char* item_ptr) {//生产者生产 并标记为T True 代表该处已满
*item_ptr = 'T'
}
void put_buffer(int pass) {//生产者将物品放入缓冲区
buffer[front] = pass
printf("produce is %c into buffer[%d]\n", buffer[front], front)
front = (front + 1) % n
}
void remove_buffer(char* release) {//消费者消费缓冲区,并标记为F false 代表该处已空
printf("consumer use is %c from buffer[%d]\n", buffer[rear], rear)
*release = buffer[rear]
buffer[rear] = 'F'
printf("now the buffer[%d] is %c !\n", rear, buffer[rear])
rear = (rear + 1) % n
}
void consume_item() {
printf("consumer had use the product\n\n")
}
void proceducer() {
char item
while (1) {
Sleep(1000)
produce_item(&item)
wait(empty)
wait(mutex)
put_buffer(item)
signal(mutex)
signal(full)
if (full == n)
consumer()
}
}
void consumer() {
char get_item
while (1) {
Sleep(1000)
wait(full)
wait(mutex)
remove_buffer(&get_item)
signal(mutex)
signal(empty)
consume_item()
if (empty == n)
proceducer()
}
}
int main()
{
proceducer()
return 0
}