gpt4 book ai didi

c - pthread_create 启动例程未执行

转载 作者:太空宇宙 更新时间:2023-11-04 01:25:56 24 4
gpt4 key购买 nike

我正在尝试用 C 语言为学校的作业创建一个火车站模拟。这是一个理解线程编程的练习。这是我当前的代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <readline/readline.h>

void *train_function(void *args) {
printf("Train created!\n");
pthread_exit(0);
}

int main() {
FILE *ptr_file;
char buff[10];
int ch;
int train_count = 0;

ptr_file = fopen("./trains.txt", "r");

if (!ptr_file)
return 0;

/* Count number of trains */
while(!feof(ptr_file))
{
ch = fgetc(ptr_file);
if(ch == '\n')
{
train_count++;
}
}
pthread_t trains[train_count];

/* Create train for each line of file */
int train_index = 0;
while (fgets(buff,10, ptr_file)!=NULL) {
pthread_create(&trains[train_index], NULL, train_function, NULL);
train_index++;
}
fclose(ptr_file);

/* Wait for all trains to leave the station */
for (int x = 0; x < train_count; x++) {
pthread_join(trains[x], NULL);
}
exit(0);
}

代码从文件 trains.txt 中读取有关火车的信息,并为文件的每一行(每列火车)创建一个新线程。

e:10,6
W:5,7
E:3,10

我希望输出是“Train Created!”三次。编译代码会产生段错误。我错过了什么?

最佳答案

 while (fgets(buff,10, ptr_file)!=NULL) {
pthread_create(&trains[train_index], NULL, train_function, NULL);
train_index++;
}

在这里,您正在再次读取文件,但是文件指针已经位于文件末尾,因为您在此 while 循环之前已经读取了整个文件。因此,您根本没有创建任何线程,而是稍后尝试与不存在的线程加入(pthread_join 调用)。这是未定义的行为。您只需使用 train_count 并在 for 循环中创建线程:

 for (int x = 0; x < train_count; x++) {
pthread_create(&trains[x], NULL, train_function, NULL);
}

此外,请注意文件读取部分存在缺陷:

while(!feof(ptr_file)) {...}

参见 Why is “while ( !feof (file) )” always wrong?用于修复它。

关于c - pthread_create 启动例程未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30854704/

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