gpt4 book ai didi

c - 无法找到段错误原因

转载 作者:行者123 更新时间:2023-12-04 05:47:18 26 4
gpt4 key购买 nike

该程序应该根据传递给它的参数创建 x 个线程。 argv[1] 是 main 应该休眠的数量,argv[2] 是 propucer 线程的数量,argv[3] 是消费者线程的数量。该程序编译良好,我一直用来运行它的命令是:程序 10 1 1 .

我已经盯着这段代码一段时间了,我似乎无法找到导致段错误的原因。或许第二双眼睛就能很快把它捡起来。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
#include <pthread.h>
#include "buffer.h"

void *producer(void *);
void *consumer(void *);

// Semaphores
sem_t empty;
sem_t full;
pthread_mutex_t mutex;

// Buffer
int placed = 0;
buffer_item buffer[BUFFER_SIZE];
int insert_item(buffer_item item){
/* INSERT ITEM INTO BUFFER */
int z;
sem_wait(&empty);

//mutex lock
z = pthread_mutex_lock(&mutex);
if (z != 0){
return -1;
}
buffer[placed] = item;

//mutex unlock
z = pthread_mutex_unlock(&mutex);
if (z != 0){
return -1;
}

sem_post(&full);
placed++;
printf("producer produced %d\n", item);
}

int remove_item(buffer_item *item){
/* REMOVE ITEM FROM BUFFER */
int m;
placed--;
sem_wait(&full);

//mutex lock
m = pthread_mutex_lock(&mutex);
if (m != 0){
return -1;
}
buffer[placed] = -1;

//mutex unlock
m = pthread_mutex_unlock(&mutex);
if (m != 0){
return -1;
}

sem_post(&empty);
printf("consumer consumed %d\n", rand);
return 0;
}

// Main

int main(int argc, char *argv[]){
int sleepNum, pThreadNum, cThreadNum, p;
sleepNum = atoi(argv[1]);
pThreadNum = atoi(argv[2]);
cThreadNum = atoi(argv[3]);


// Initialize Semaphores & mutex
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);

// Create producer thread
pthread_t tid[pThreadNum];

int g=pThreadNum-1;
while(g >= 0){
p = pthread_create(&tid[g], NULL, producer, NULL);
g--;
}
printf("created prod thread");
// Create consumer thread
pthread_t kid[cThreadNum];
g = cThreadNum-1;
while(g >= 0){
p = pthread_create(&kid[g], NULL, consumer, NULL);
g--;
}

// Sleep for argv[0]
sleep(sleepNum);

// Destroy mutex & semaphores
sem_destroy(&empty);
sem_destroy(&full);
p = pthread_mutex_destroy(&mutex);

// Exit
exit(0);
}


// Producer
void *producer(void *param){
buffer_item rand;
unsigned int *seed;
int b;
while(1){
sleep(2);
rand = rand_r(seed);
b = insert_item(rand);
if (b < 0){
printf("Error producing item.");
}
}
}

// Consumer
void *consumer(void *param){
buffer_item rand;
int d;
while(1){
sleep(2);
d = remove_item(&rand);
if (d < 0){
printf("Error removing item");
}
}
}

提前致谢!

最佳答案

在生产者中,您使用的是未初始化的指针。尝试使用 malloc 为其分配一些内存。我没有确切地解释它是什么,因为你把它标记为家庭作业。

也不要依赖 printf 语句的输出来告诉您程序在使用线程时到达的位置。如果您在每个 printf 之后显式刷新输出流会有所帮助,那么您几乎可以了解正确的事件序列。

关于c - 无法找到段错误原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10507073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com