c - 打印传递给 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
我知道我不能依赖连续的数字,但为什么它会打印其中一些两次?
解决方案
正如@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);
}
推荐阅读
- javascript - 出血区域适用于通过鼠标拖动移动的对象,但不适用于键盘的箭头键
- sql - 仅从一对无序的相同行 SQL/PostgreSQL 中选择行
- linux - 如何在拖尾文件时每隔“n”个空格插入空格或字符?
- python - 我想将 1fd93d1cf1f13d0d 转换为 00011111 11011001 00111101 00011100 11110001 11110001 00111101 00001101
- wordpress - Wordpress:将头部内容推入正文的脚本错误
- google-app-engine - 将子域映射到应用引擎上的特定服务
- r - 在ggplot2中重命名变量名
- angularjs - 如何在 AngularJS 中发布 Json 对象数组(使用 $resource save 或通过 $http 服务)以及如何在 Resteasy 中使用它
- python - Python - 如何对字母和数值列表进行排序?
- jquery - 使用 jQuery 使侧边栏与内容高度相同