我有以下代码
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 *时,我会遇到分段错误编辑。
谁能告诉我为什么?
答案 0 :(得分:1)
要检查的第一件事是来自pthread_create
调用的返回值,你要存储它们,但是从不检查线程是否真正启动了。
如果pthread_create
失败,那么pthread_t将是垃圾,会崩溃pthread_join
编辑:
实际上要做的第一件事是使用-Werror -Wall
进行编译,因为我认为你不能像那样声明数组。
这应该是C代码,所以在所有代码之前移动变量的所有声明。这应该突出可能破坏事情的问题 - 你不能像这样在堆栈上分配可变大小的数组。如果需要可变大小的数组,则需要malloc
堆上的空间。
答案 1 :(得分:0)
好的问题不在管道中......但在实际声明中:
int producers_return_vals[num_producers];
pthread_t producers[num_producers];
通常动态分配数组使用_alloca调用;如果alloca调用是错误的(它往往是在令人惊讶的大量平台上)或者如果你的编译器不支持动态分配(你正在使用哪个版本的C编译器?)那么你可能会遇到一个SIGSEG ......确保您使用的是支持c99的编译器,因为这是动态分配可用的地方。