生产者-消费者解决方案运行但不打印
Producer-Consumer solution runs but doesn't print
这是我当前的生产者-消费者问题代码。我编译了它并 运行 它但没有打印任何内容。命令行接受 3 个参数:睡眠时间、生产者线程、消费者线程。我已经尝试将值分别设置为 5、1、1,睡眠定时器可以正常工作,但我不确定其余部分。
buffer.h的代码:
typedef int buffer_item;
#define BUFFER_SIZE 5
buffer.c的代码:
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include "buffer.h"
buffer_item buffer[BUFFER_SIZE];
void *producer(void *param);
void *consumer(void *param);
pthread_mutex_t mutex;
sem_t empty;
sem_t full;
int insert_item(buffer_item item)
{
do
{
wait(empty);
wait(mutex);
signal(mutex);
signal(full);
}while(1);
return 0;
}
int remove_item(buffer_item *item)
{
do
{
wait(full);
wait(mutex);
signal(mutex);
signal(empty);
}while(1);
return 0;
}
int main(int argc, char *argv[])
{
int sleepTime;
int producerThreads;
int consumerThreads;
int counter_1;
int counter_2;
if(argc != 4)
{
return -1;
}
sleepTime = atoi(argv[1]);
producerThreads = atoi(argv[2]);
consumerThreads = atoi(argv[3]);
srand((unsigned)time(NULL));
for(counter_1 = 0; counter_1 < producerThreads; counter_1++)
{
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&tid, &attr, producer, NULL);
}
for(counter_2 = 0; counter_2 < consumerThreads; counter_2++)
{
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&tid, &attr, consumer, NULL);
}
sleep(sleepTime);
return 0;
}
void *producer(void *param)
{
buffer_item item;
int randomTime;
int counter_1 = 0;
while(1)
{
randomTime = rand() % 1000 + 1;
sleep(randomTime);
item = rand();
if(insert_item(item))
{
fprintf(stderr, "Error.");
}
else
{
printf("Producer ID: %lu, Produced Item: %d\n", pthread_self(), item);
printf("The buffer now contains %d items\n", counter_1);
++counter_1;
}
}
}
void *consumer(void *param)
{
buffer_item item;
int randomTime;
int counter_2 = 0;
while(1)
{
randomTime = rand() % 1000 + 1;
sleep(randomTime);
if(insert_item(item))
{
fprintf(stderr, "Error.");
}
else
{
printf("Consumer ID: %lu, Consumed Item: %d\n", pthread_self(), item);
printf("The buffer now contains %d items\n", counter_2);
++counter_2;
}
}
}
到目前为止,我已经尝试单独声明 tid,跳过 sleep 并加入线程,但它仍然没有打印。
您的代码不可能 运行,事实上它甚至无法编译。
以下是需要解决的问题列表:
wait
应该是 sem_wait
signal
对于信号量 应该是 sem_post
int sem_wait(sem_t *sem);
和 int sem_post(sem_t *sem);
将指针指向信号量
sem_wait(mutex)
和 sem_post(mutex)
给出类似“sem_wait 的参数 1 的不兼容类型”之类的东西,我猜你想获取和释放互斥体上的锁,比如 [=18] =] 和 pthread_mutex_unlock(&mutex)
- 在消费者
if(insert_item(item))
中:item
使用未初始化
- 仍然在消费者中使用
insert_item
而不是 remove_item
来到主要问题 “我编译了它 运行 但没有打印任何东西”,它没有打印任何东西因为 producer
和consumer
分别调用 insert_item
和 remove_item
并陷入无限循环(例如 while(1)
)
这是我当前的生产者-消费者问题代码。我编译了它并 运行 它但没有打印任何内容。命令行接受 3 个参数:睡眠时间、生产者线程、消费者线程。我已经尝试将值分别设置为 5、1、1,睡眠定时器可以正常工作,但我不确定其余部分。
buffer.h的代码:
typedef int buffer_item;
#define BUFFER_SIZE 5
buffer.c的代码:
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include "buffer.h"
buffer_item buffer[BUFFER_SIZE];
void *producer(void *param);
void *consumer(void *param);
pthread_mutex_t mutex;
sem_t empty;
sem_t full;
int insert_item(buffer_item item)
{
do
{
wait(empty);
wait(mutex);
signal(mutex);
signal(full);
}while(1);
return 0;
}
int remove_item(buffer_item *item)
{
do
{
wait(full);
wait(mutex);
signal(mutex);
signal(empty);
}while(1);
return 0;
}
int main(int argc, char *argv[])
{
int sleepTime;
int producerThreads;
int consumerThreads;
int counter_1;
int counter_2;
if(argc != 4)
{
return -1;
}
sleepTime = atoi(argv[1]);
producerThreads = atoi(argv[2]);
consumerThreads = atoi(argv[3]);
srand((unsigned)time(NULL));
for(counter_1 = 0; counter_1 < producerThreads; counter_1++)
{
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&tid, &attr, producer, NULL);
}
for(counter_2 = 0; counter_2 < consumerThreads; counter_2++)
{
pthread_t tid;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_create(&tid, &attr, consumer, NULL);
}
sleep(sleepTime);
return 0;
}
void *producer(void *param)
{
buffer_item item;
int randomTime;
int counter_1 = 0;
while(1)
{
randomTime = rand() % 1000 + 1;
sleep(randomTime);
item = rand();
if(insert_item(item))
{
fprintf(stderr, "Error.");
}
else
{
printf("Producer ID: %lu, Produced Item: %d\n", pthread_self(), item);
printf("The buffer now contains %d items\n", counter_1);
++counter_1;
}
}
}
void *consumer(void *param)
{
buffer_item item;
int randomTime;
int counter_2 = 0;
while(1)
{
randomTime = rand() % 1000 + 1;
sleep(randomTime);
if(insert_item(item))
{
fprintf(stderr, "Error.");
}
else
{
printf("Consumer ID: %lu, Consumed Item: %d\n", pthread_self(), item);
printf("The buffer now contains %d items\n", counter_2);
++counter_2;
}
}
}
到目前为止,我已经尝试单独声明 tid,跳过 sleep 并加入线程,但它仍然没有打印。
您的代码不可能 运行,事实上它甚至无法编译。 以下是需要解决的问题列表:
wait
应该是sem_wait
signal
对于信号量 应该是 int sem_wait(sem_t *sem);
和int sem_post(sem_t *sem);
将指针指向信号量sem_wait(mutex)
和sem_post(mutex)
给出类似“sem_wait 的参数 1 的不兼容类型”之类的东西,我猜你想获取和释放互斥体上的锁,比如 [=18] =] 和pthread_mutex_unlock(&mutex)
- 在消费者
if(insert_item(item))
中:item
使用未初始化 - 仍然在消费者中使用
insert_item
而不是remove_item
sem_post
来到主要问题 “我编译了它 运行 但没有打印任何东西”,它没有打印任何东西因为 producer
和consumer
分别调用 insert_item
和 remove_item
并陷入无限循环(例如 while(1)
)