C为什么在我的代码中创建的线程数量不一致?

C为什么在我的代码中创建的线程数量不一致?,c,multithreading,C,Multithreading,我的任务的目标是创建一个循环,以生成5个具有整数参数0到4的线程。我有3个文件:thread_demo.c(包含主函数)、worker.c(包含计算参数平方的函数)和header.h(将两个文件放在一起) 线程_demo.c #include "header.h" #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <readline/readline.h> #

我的任务的目标是创建一个循环,以生成5个具有整数参数0到4的线程。我有3个文件:thread_demo.c(包含主函数)、worker.c(包含计算参数平方的函数)和header.h(将两个文件放在一起)

线程_demo.c

#include "header.h"
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>

#define NUM_THREADS 5
#define PROMPT_SIZE 5

int main(){
        pthread_t threads[NUM_THREADS];
        pthread_attr_t pthread_attributes;

        int *prompt;
        scanf("%d", &prompt);

        for(int i = 0; i < NUM_THREADS; i++){
                pthread_create(&threads[i], &pthread_attributes, &worker, (void *) prompt);
        } 
} 
#包括“header.h”
#包括
#包括
#包括
#包括
#定义NUM_线程5
#定义提示大小5
int main(){
pthread_t threads[NUM_threads];
pthread_attr_t pthread_属性;
int*提示;
scanf(“%d”,提示(&P);
对于(inti=0;i
工人c

#include "header.h"
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void *worker(void * num){
        int *input;
        input = (int*) &num;

        // Calculate square
        int output = *input * *input;

        printf("The square of %d", *input);
        printf(" is %d.\n", output);

        pthread_exit(NULL);
}
#包括“header.h”
#包括
#包括
#包括
#包括
void*worker(void*num){
int*输入;
输入=(int*)&num;
//计算平方
int输出=*输入**输入;
printf(“%d的平方,*输入);
printf(“是%d.\n”,输出);
pthread_exit(NULL);
}
我没有编译错误,但代码生成的线程数不一致。显示的图片是我输入“5”3个不同时间的输出,在此期间我没有对代码进行更改。我不确定这是什么原因,我知道我遗漏了什么,但我不知道是什么原因。 我还必须让“主线程等待所有线程完成”,这让我感到困惑。当我生成5个线程时,我如何知道哪个是主线程? 我从来没有写过与进程和线程相关的代码,所以我完全迷路了。任何帮助都将不胜感激


您的程序可能在所有线程完成之前退出。这可以解释为什么您在不同的运行中看到不同的输出:有时您的程序会或多或少地快速退出,从而完成更少或更多的工作

您需要防止程序退出(从
main()
返回),直到所有线程完成。为此,可以对每个线程使用
pthread\u join
。创建所有线程后添加:

for(int i = 0; i < NUM_THREADS; i++) {
    pthread_join(threads[i]);
}
for(inti=0;i
ptread\u join
将阻塞(在该行停止执行),直到线程终止

从文档中:

pthread_join()函数等待线程指定的线程 终止。如果该线程已经终止,那么 pthread_join()立即返回。线程指定的线程 必须是可接合的


我认为您应该从编译代码开始(从
int*提示符中删除
)并避免调用未定义的行为(通过
scanf()
)使用适当的类型读取数据。只是一个旁注,5的平方根不是25。哦,我的坏消息是额外的”)“当我在这里格式化代码时,你有:
int*prompt;scanf(“%d”,提示(&P)–您不需要
*
。此时,您将一个未初始化指针的地址传递给
scanf()
,并要求它读取一个整数。你应该从你的编译器那里得到关于类型不匹配的尖叫声——如果你没有,要么打开编译器警告,这样这些问题就会被识别为错误,要么找一个更好的编译器。如果您使用的机器是
sizeof(int)==sizeof(int*)
,那么它可能会起到一定的作用——大多数32位系统都符合这一要求,但大多数64位系统不符合这一要求。还有其他问题需要解决。请注意,您将相同的值(
提示符
)传递给每个线程;这就是为什么每个线程执行相同的任务。