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