将传递的参数打印到pthread_create

时间:2018-07-31 12:03:48

标签: c multithreading

我想打印传递给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

我知道我不能依靠连续数字,但是为什么它会打印两次?

1 个答案:

答案 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);
}