我有以下代码
int loopval;
char *message = "D";
//
//KICK OUT THE BAD CALLS
if(argc != 5)
terminate("INVALID ARGUEMENTS");
//set arguements
int num_producers;
num_producers = atoi(argv[1]);
int num_consumers;
num_consumers = atoi(argv[2]);
int items_per_producer;
items_per_producer = atoi(argv[3]);
int max_in_pipe;
max_in_pipe = atoi(argv[4]);
///set up the pipe
int fd[2];
pipe(fd);
////
//create producers and consumers arrays
int producers_return_vals[num_producers];
pthread_t producers[num_producers];
int consumers_return_vals[num_consumers];
pthread_t consumers[num_consumers];
//create producers threads
for(loopval = 0; loopval < num_producers; loopval++)
{
producers_return_vals[loopval] = pthread_create( &producers[loopval], NULL, produce, (void*)message);
}
//create consumers threads
for(loopval = 0; loopval < num_consumers; loopval++)
{
consumers_return_vals[loopval] = pthread_create( &consumers[loopval], NULL, consume, (void*)message);
}
//join producers
for(loopval = 0; loopval < num_consumers; loopval++)
{
pthread_join(producers[loopval], NULL);
}
//join consumers
for(loopval = 0; loopval < num_producers; loopval++)
{
pthread_join(consumers[loopval], NULL);
}
exit(0);
消费者和生产者线程现在是一样的
void *consume(void *ptr)
{
puts("HELLO FROM Consumer");
}
当我调用 pipe(fd)
时,当线程加入时出现段错误EDIT*/EDIT*。
谁能告诉我为什么?
最佳答案
首先要检查的是 pthread_create
调用的返回值,您正在存储它们,但从未检查线程是否实际启动。
如果 pthread_create
失败,则 pthread_t 将成为垃圾,从而导致 pthread_join
崩溃
编辑:
实际上要做的第一件事是使用 -Werror -Wall
进行编译,因为我认为您不能那样声明数组。
这应该是 C 代码,所以将所有变量声明移到所有代码之前。这应该突出了可能破坏事物的问题 - 你不能像那样在堆栈上分配可变大小的数组。如果您需要可变大小的数组,则需要 malloc
堆上的空间。
关于C 管道分段故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7904220/