我想打印传递给create_thread
的参数。我创建了一个包含10个int
的数组来模拟每个线程的数量-
void* thr_func(void *arg){
printf("\nTHREAD ID %d", *(int*)arg);
return 0;
}
int main(){
int arr[10]={0,1,2,3,4,5,6,7,8,9};
pthread_t thread_id;
for(int i=0;i<10;i++){
pthread_create(&thread_id, NULL, &thr_func,&arr[i]);
}
return 0;
}
这是两次运行的输出 1:
THREAD ID 1
THREAD ID 5
THREAD ID 6
THREAD ID 2
THREAD ID 3
THREAD ID 4
TTHREAD ID 0
THREAD ID 3
2:
THREAD ID 1
THREAD ID 2
THREAD ID 5
THREAD ID 6
THREAD ID 3
THREAD ID 7
THREAD ID 4
THREAD ID 8
THREAD ID 8
我知道我不能依靠连续数字,但是为什么它会打印两次?
答案 0 :(得分:1)
正如@Some程序员伙计所提到的那样,您应该始终等待child threads
函数中单个main
的终止(除非分离线程)。 why
中的某些array
元素被打印两次或更多次的原因是,在清除缓冲区之前,thread
可能会被杀死。 (在您的情况下为thread 8
)。为避免进程在完成工作之前被关闭,您必须wait
使用线程,或者换句话说,您必须加入线程。
这是通过添加功能完成的:pthread_join(pthread_t thread, void **retvalue);
pthread_join()函数等待线程指定的线程终止。
只需在您的loop
之后将其放在单独的pthread_create() function
中,父母thread
(主要)将等待他的孩子。
修改:
要等待每个thread
,可以将pthread_t
变量更改为线程数组:pthread_t thread[10]
,以便可以等待与索引相关的每个线程。
int arr[10]={0,1,2,3,4,5,6,7,8,9};
pthread_t thread[10];
for(int i=0;i<10;i++){
pthread_create(&thread[i], NULL, &thr_func,&arr[i]);
}
for(int i=0;i<10;i++){
pthread_join(thread[i],NULL);
}