c - 为什么我不能将我的“for”索引直接传递给 pthread_create 调用?
问题描述
#define THREADS_NUMBER 10
给定一个函数 f:
void *f(void *arg){
pthread_mutex_lock(&mutex);
printf("%i\n", *((int*) arg);
pthread_mutex_unlock(&mutex);
}
我不明白为什么要写这个:
pthread_t threads[THREADS_NUMBER];
for(int i = 0; i < THREADS_NUMBER; i++){
pthread_create(&threads[i], NULL, f, &i);
}
for(int i = 0; i < THREADS_NUMBER; i++){
pthread_join(threads[i], NULL);
}
输出这个:
2 4 4 5 5 6 8 8 9 10
在写这个的时候:
int t[10];
for(int i = 0; i < 10; i++)
t[i] = i;
pthread_t threads[THREADS_NUMBER];
for(int i = 0; i < THREADS_NUMBER; i++){
pthread_create(&threads[i], NULL, f, &t[i]);
}
for(int i = 0; i < THREADS_NUMBER; i++){
pthread_join(threads[i], NULL);
}
输出这个:
0 1 4 3 5 2 6 7 9 8
(如果您没有注意到差异,那就是调用中传递给线程函数的参数f
。pthread_create
)
解决方案
尝试展开循环。这两种情况将变成如下。
第一种情况:
pthread_create(&threads[0], NULL, f, &i);
pthread_create(&threads[1], NULL, f, &i);
…
pthread_create(&threads[9], NULL, f, &i);
第二种情况:
pthread_create(&threads[0], NULL, f, &t[0]);
pthread_create(&threads[0], NULL, f, &t[1]);
…
pthread_create(&threads[9], NULL, f, &t[9]);
如果您注意到,在第一种情况下,您总是传递&i
给每个线程,因此每个线程将指向相同i
的内容及其最新内容。
推荐阅读
- java - ARCore – 模型旋转
- c - 如果我使用静态关键字检查大小会发生什么
- multithreading - Runspace 和 Job 之间的性能差异
- java - Spring Boot WebSecurityConfig LogoutSuccessURL with invalidSessionUrl
- angular - 模板驱动的表单重置
- sql - 返回按查询分组的整行
- javascript - 根据最大字符长度拆分字符串,但要考虑单词
- reinforcement-learning - 状态,多体环境中的每一步奖励
- html - 视频使整个网站崩溃
- python - 如何区分空字符串“”和空输入?