首页 > 解决方案 > 打印传递给 pthread_create 的参数

问题描述

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

我知道我不能依赖连续的数字,但为什么它会打印其中一些两次?

标签: cmultithreading

解决方案


正如@Some程序员花花公子所提到的,您应该始终等待函数中的单曲终止child threadsmain除非您分离线程)。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);
}

推荐阅读