【发布时间】:2017-05-11 13:08:48
【问题描述】:
我当前的代码回答了生产者消费者的问题,但我想以不同的方式实现它。我不想使用全局变量来跟踪缓冲区堆栈中的计数。我的思考过程应该是什么?
typedef int semaphore;
semaphore mutex, full, empty;
int count = 0;
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
} arg;
int buffer[N];
这些是使用count的函数
int remove_item()
{
int ret = buffer[--count];
buffer[count] = 0;
return ret;
}
void insert_item(int item)
{
buffer[count++] = item;
}
int produce_item(){
int item = rand()%50 +1;
printf("Producer produces %d\n",item);
sleep(1);
return item;
}
还有我的生产者消费者函数
void* consumer(void * arg) {
int item = 0;
while(1){
down(full);
down(mutex);
item = remove_item();
buffer[count++] = item;
up(mutex);
up(empty);
consume_item(item);
}
return 0;
}
void* producer(void* arg) {
int item, i =0;
while(1){
item = produce_item();
down(empty);
down(mutex);
insert_item(item);
up(mutex);
up(full);
sleep(1);
}
【问题讨论】:
-
计数、三个信号量和缓冲区空间都属于一个'PCqueue'结构。您需要一个函数来返回一个已初始化的函数(或指向它的指针)。然后可以轻松地将结构提升到任何线程的堆栈上。
-
发布的代码没有实现任何信号量。由此产生的
race条件将导致数据损坏、丢失、重复。
标签: c multithreading semaphore producer-consumer