c - 如何使用指针将从 Pthread 返回的多个数组存储在另一个数组中
问题描述
我正在开发一个需要同时运行多个线程的项目。每个线程运行一个函数,该函数返回一个指向整数数组的指针(转换为 void 指针)。例如,在线程运行的函数中,我想要的值是这样存储的:
void *func(void *args) {
int vals[3] = {0, 0, 0}, x = y = z = 0;
int *ptr = vals;
while(condition) {
.
.
.
ptr[0] += x;
ptr[1] += y;
ptr[2] += z;
}
return (void *) ptr;
}
在此函数结束时,ptr[0]、ptr[1] 和 ptr[2] 将保持所需的值。这段代码只是为了让您了解发生了什么,我的实际实现没有任何问题。
我需要使用 pthread_join() 从每个线程获取各种值。每个线程处理一个文件,因此文件数 == 线程数 == 上述函数运行的次数。
我需要从每个线程中获取 ptr[0]、ptr[1] 和 ptr[2] 的值,并在它们返回到 main 后将它们加在一起。意思是如果有三个线程,那么我需要将线程 1 的 ptr[0] 添加到线程 2 的 ptr[0] 和线程 3 的 ptr[0]。 ptr[1] 和 ptr[2] 也是如此. 然后我需要在最后打印 main 中的三个总值。到目前为止,这就是我完成它的方式,并且我得到了要编译的代码,但是这些值是垃圾。
int main(int argc, char *argv[]) {
int NUM_THREADS = argc - 1;
int total1 = total2 = total3 = 0;
pthread_t *tids; /* Dynamically allocated array of pthreads */
void **vals; /* Stores the return values from each thread, this could be incorrect */
/*
** Some code where I allocate the arrays etc
*/
for (i= 0; i < NUM_THREADS; i++)
pthread_create(&tids[i], NULL, func, NULL);
for (i= 0; i < NUM_THREADS; i++)
pthread_join(tids[i], &(vals[i])); /* Again, this could be wrong */
for (i= 0; i < NUM_THREADS; i++) {
total1 += ((int*) vals[i])[0]; /* These statements very well could also be wrong */
total2 += ((int*) vals[i])[1];
total3 += ((int*) vals[i])[2];
}
/* Print totals */
return 0;
}
我知道每个线程中的值在 func 结束时都是正确的,但我不知道如何在 main 中正确存储、处理和打印它们。
另外,我使用的是 C90,不能使用任何其他版本的 C 的任何功能,我必须使用 pthread_join() 存储值。
解决方案
每个线程运行一个函数,该函数返回一个指向整数数组的指针(转换为 void 指针)。例如
void *func(void *args) { int vals[3] = {0, 0, 0}, x = y = z = 0; int *ptr = vals; ... return (void *) ptr; }
您应该首先修复函数以返回有意义的内容。如当前所写,该函数返回一个指向自动数组的指针vals
,该指针在函数返回后不再存在。
对返回指针的任何使用都会产生未定义的行为。
这段代码只是为了让您了解发生了什么,我的实际实现没有任何问题。
这有点难以置信。
pthread_join(tids[i], &(vals[i])); /* Again, this could be wrong */
那是错误的:vals
此时未初始化,因此您正在整个随机内存中写入。
我不知道如何在 main.js 中正确存储、处理和打印它们。
方法如下:
void *vals[NUM_THREADS];
..
for (i= 0; i < NUM_THREADS; i++) {
pthread_join(tids[i], &vals[i]);
}
for (i= 0; i < NUM_THREADS; i++) {
int *p = (int *)vals[i];
total1 += p[0];
total2 += p[1];
... etc.
}
推荐阅读
- php - 如何使用 LOAD INFILE 更新表?
- java - JavaFX 9 @font-face css 不适用于运行时
- adyen - Adyen MarketPay 支持的国家/地区?
- android - 某些 Android 版本的 Firebase 消息传递奇怪行为
- typescript - 在多个组件中共享模型
- c# - 带有表情符号按钮的自定义条目渲染器 (Keyboard.Chat)
- vespa - 如何监控 Vespa 索引磁盘的使用情况和索引文档的数量
- ios - 获取 2 点纬度之间的旅行时间,长 Swift google api
- c# - 使用 HttpClent 请求创建多个任务的最佳方法
- javascript - 是否可以在 React 中定义计算的状态变量?