如何连接/分离/清理每个函数调用创建的动态malloc线程?

如何连接/分离/清理每个函数调用创建的动态malloc线程?,c,linux,multithreading,pthreads,C,Linux,Multithreading,Pthreads,我为我的问题编写了一个示例代码。在while循环中,我为每个函数调用动态创建新线程,这些线程将在calculate函数中处理。这可能需要几秒钟才能完成,我用睡眠来模拟这一过程 我怎样清洗这些线?它们有单独的线程和自己的参数堆栈,因此在每次调用结束时,是否可以在计算函数中清除它们?但是我会遇到这样的问题:当满足random==2的条件并且程序退出时,一些线程仍然在计算 我正在考虑一个变量,当计算完成时,该变量的状态会发生变化,但仍然存在如上所述的问题。有什么想法吗 #include <std

我为我的问题编写了一个示例代码。在while循环中,我为每个函数调用动态创建新线程,这些线程将在calculate函数中处理。这可能需要几秒钟才能完成,我用睡眠来模拟这一过程

我怎样清洗这些线?它们有单独的线程和自己的参数堆栈,因此在每次调用结束时,是否可以在计算函数中清除它们?但是我会遇到这样的问题:当满足
random==2
的条件并且程序退出时,一些线程仍然在计算

我正在考虑一个变量,当计算完成时,该变量的状态会发生变化,但仍然存在如上所述的问题。有什么想法吗

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>

struct args_struct {
    pthread_t pt;
    int random;
};

void* calculate(void *arguments){
    struct args_struct *args = arguments;
    sleep(args->random);
    printf("Number: %d. %s", args->random, "Calculations completed, thanks for waiting!");
}

int main(){
    while(1){
        struct args_struct *args = malloc(sizeof (struct args_struct));
        time_t t;
        srand((unsigned) time(&t));
        args->random = rand() % 5;

        if(pthread_create( &args->pt, NULL, calculate, (void *)&args) != 0)
            printf("Error in creating thread!");        

        if (args->random == 2 ){ //random condition in exiting loop
            printf("Number is %d. Exiting program and joining remainder threads still running...", args->random);
            //pthread_join? free(args)? pthread_exit? pthread_detach?
            //pthread_join(args->pt, NULL);
            //free(args);
            return 0;
        };
    }
}
#包括
#包括
#包括
#包括
#包括
结构args\u结构{
pthread_t pt;
int随机;
};
void*计算(void*参数){
struct args_struct*args=参数;
睡眠(args->random);
printf(“数字:%d.%s”,参数->随机,“计算完成,谢谢等待!”);
}
int main(){
而(1){
struct args_struct*args=malloc(sizeof(struct args_struct));
时间;
srand((未签名)时间(&t));
args->random=rand()%5;
if(pthread_create(&args->pt,NULL,calculate,(void*)&args)!=0)
printf(“创建线程时出错!”);
如果(args->random==2){//退出循环中的随机条件
printf(“编号为%d。正在退出程序并加入仍在运行的剩余线程…”,args->random);
//pthread_join?free(args)?pthread_exit?pthread_detach?
//pthread_join(args->pt,NULL);
//免费(args);
返回0;
};
}
}

pthread_create()的参数参数错误。 尝试更改(void*)&args->(void*)args

默认的标准输出流缓冲是行缓冲(_IOLBF)。 尝试在printf()函数中插入“\n”字符

仅创建一次种子(srand函数)

最后,尝试以下方法

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>

struct args_struct {
    pthread_t pt; 
    int random;
};

void* calculate(void *arguments){
    struct args_struct *args = arguments;
    sleep(args->random);
    printf("Number: %d. %s\n", args->random, "Calculations completed, thanks for waiting!");
    if (args->random != 2) free(args);
}

int main(){
    time_t t;
    srand((unsigned) time(&t));
    while(1){
        struct args_struct *args = malloc(sizeof (struct args_struct));
        args->random = rand() % 5;

        if(pthread_create( &args->pt, NULL, calculate, (void *)args) != 0)
            printf("Error in creating thread!\n");    

        if (args->random == 2 ){ //random condition in exiting loop
            printf("Number is %d. Exiting program and joining remainder threads still running...\n", args->random);
            pthread_join(args->pt, NULL);
            free(args);
            return 0;
        };  
    }   
}
#包括
#包括
#包括
#包括
#包括
结构args\u结构{
pthread_t pt;
int随机;
};
void*计算(void*参数){
struct args_struct*args=参数;
睡眠(args->random);
printf(“数字:%d.%s\n”,参数->随机,“计算完成,谢谢等待!”);
如果(参数->随机!=2)自由(参数);
}
int main(){
时间;
srand((未签名)时间(&t));
而(1){
struct args_struct*args=malloc(sizeof(struct args_struct));
args->random=rand()%5;
if(pthread_create(&args->pt,NULL,calculate,(void*)args)!=0)
printf(“创建线程时出错!\n”);
如果(args->random==2){//退出循环中的随机条件
printf(“编号为%d。正在退出程序并加入仍在运行的剩余线程…\n”,args->random);
pthread_join(args->pt,NULL);
免费(args);
返回0;
};  
}   
}

谢谢,但此代码不起作用。它不等待
args->random>2
上面的线程。例如,如果打印出
args->random
,pthread\u连接不会等待这些操作完成。似乎创建的线程并不都是等待的