为什么我的线程不在程序完成之前将其结果存储在数组中?
Why isn't my thread storing its result in an array before the program completes?
我已经四处寻找了好一阵子,但似乎没有任何解决方案(例如 thread_join 或 pthread_exit)对我有用。我正在尝试让一个线程(如果我能让一个线程工作的话,有几个)评估一些东西,如果成功的话,将 1 存储在归零数组中的一个位置上,但是我的程序在线程之前完成(或至少打印数组)可以编辑数组。这是一些等效的代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define numThreads 1
#define resultSize 6
/* function definitions */
void setZero(int[]);
void printResultArray(int[]);
void *setResult(void *);
int resultArray[resultSize];
/* main Program */
int main(void) {
int i = 0;
pthread_t tid[numThreads];
setZero(resultArray);
printf("Creating worker thread..\n");
for(i = 0;i < numThreads; i++)
tid[i] = pthread_create(&tid[i], NULL, setResult, NULL);
for(i = 0;i < numThreads; i++)
pthread_join(tid[i], NULL);
// sleep(1);
printf("Array values: ");
printResultArray(resultArray);
pthread_exit(NULL);
}
void *setResult(void *param){
resultArray[0] = 1;
pthread_exit(NULL);
}
void printResultArray(int results[]) {
int i;
for(i=0; i<resultSize; i++)
printf("%d ", results[i]);
printf("\n");
}
void setZero(int results[]) {
int i;
for(i=0; i<resultSize; i++)
results[i] = 0;
}
如果删除关于 sleep(1) 的注释,我会得到我想要的 100000,否则我会得到全零,但显然我不希望它休眠。
tid[i] = pthread_create(&tid[i], NULL, setResult, NULL);
使用 pthread_create()
调用中的值 return 将 tid[i]
丢弃。
pthread_create()
return 表示成功 (0) 或失败(错误编号)——它不是 return 一个 pthread_t
对象。
很可能,您对 pthread_join()
的调用立即 returning 并出现错误。
我已经四处寻找了好一阵子,但似乎没有任何解决方案(例如 thread_join 或 pthread_exit)对我有用。我正在尝试让一个线程(如果我能让一个线程工作的话,有几个)评估一些东西,如果成功的话,将 1 存储在归零数组中的一个位置上,但是我的程序在线程之前完成(或至少打印数组)可以编辑数组。这是一些等效的代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define numThreads 1
#define resultSize 6
/* function definitions */
void setZero(int[]);
void printResultArray(int[]);
void *setResult(void *);
int resultArray[resultSize];
/* main Program */
int main(void) {
int i = 0;
pthread_t tid[numThreads];
setZero(resultArray);
printf("Creating worker thread..\n");
for(i = 0;i < numThreads; i++)
tid[i] = pthread_create(&tid[i], NULL, setResult, NULL);
for(i = 0;i < numThreads; i++)
pthread_join(tid[i], NULL);
// sleep(1);
printf("Array values: ");
printResultArray(resultArray);
pthread_exit(NULL);
}
void *setResult(void *param){
resultArray[0] = 1;
pthread_exit(NULL);
}
void printResultArray(int results[]) {
int i;
for(i=0; i<resultSize; i++)
printf("%d ", results[i]);
printf("\n");
}
void setZero(int results[]) {
int i;
for(i=0; i<resultSize; i++)
results[i] = 0;
}
如果删除关于 sleep(1) 的注释,我会得到我想要的 100000,否则我会得到全零,但显然我不希望它休眠。
tid[i] = pthread_create(&tid[i], NULL, setResult, NULL);
使用 pthread_create()
调用中的值 return 将 tid[i]
丢弃。
pthread_create()
return 表示成功 (0) 或失败(错误编号)——它不是 return 一个 pthread_t
对象。
很可能,您对 pthread_join()
的调用立即 returning 并出现错误。