所以我正在运行此代码
#include <stdio.h>
#define ARRAYSIZE 17
#define NUMTHREADS 4
struct ThreadData {
int start, stop;
int *array;
};
void squarer(struct ThreadData *data) {
int start = data->start;
int stop = data->stop;
int *array = data->array;
int i;
for (i=start; i<stop;i++) {
array[i] = i*i;
}
}
int main(void) {
int array[ARRAYSIZE];
int i, start, stop;
struct ThreadData *data;
data->array = array;
int tasksPerThread = (ARRAYSIZE+NUMTHREADS-1)/NUMTHREADS;
for (i=0; i < NUMTHREADS; i++) {
start = i * tasksPerThread;
stop = (i+1) * tasksPerThread;
data->start = start;
data->stop = stop;
if (stop > ARRAYSIZE) {
stop = ARRAYSIZE;
}
squarer(data);
}
for (i=0; i < ARRAYSIZE; i++) {
printf("%d\n", i);
}
return 0;
}
由于某种原因,当我运行它时,如果给我错误消息zsh:abort ./thread
。有趣的是,在阵列完全打印之后它才会中止?我不明白为什么会这样,当它执行完所有后它肯定无法访问超出范围内存?请注意,最初printf循环打印出数组项,但我将其更改为错误检查,它仍然给我相同的运行时错误。
答案 0 :(得分:1)
在函数main
中,变量data
未初始化。无论何时使用此变量,您最有可能执行内存访问冲突,因此发生的所有事情都是“运气问题”。
您必须先将修复为:
struct ThreadData* data = (struct ThreadData*)malloc(sizeof(struct ThreadData));
...
free(data); // at the end of the program
另一个选项(在这种情况下更好的选项)是使用静态分配的实例:
struct ThreadData data;
...
squarer(&data);
现在,您的数组的问题是索引。
变化:
array[i] = i*i
要:
array[i-start] = i*i
BTW,我强烈建议您在int array[ARRAYSIZE]
结构中声明ThreadData
,或者在使用此结构的每个函数中动态分配它(而不是设置{{ 1}}指向函数array
中的本地数组。只要您在多个地方开始使用此结构, 就会成为问题。
答案 1 :(得分:0)
你在main的第3行不合适,即未定义:
struct ThreadData *data;
data->array = array;
因为数据没有在第二行初始化,对吗? data
指向任何地方 ...
struct ThreadData *data = (struct ThreadData*) malloc(sizeof(struct ThreadData));
可能有帮助。
答案 2 :(得分:0)
所以我的问题基本上是下面定义了stop变量的边缘情况条件,其中边缘情况被传递到结构中,因此stop值可能比数组大。
#include <stdio.h>
#define ARRAYSIZE 17
#define NUMTHREADS 4
struct ThreadData {
int start, stop;
int *array;
};
void squarer(struct ThreadData *data) {
int start = data->start;
int stop = data->stop;
int *array = data->array;
int i;
for (i=start; i<stop;i++) {
printf("%d %d\n",start,stop);
array[i] = i*i;
}
}
int main(void) {
int array[ARRAYSIZE];
int i, start, stop;
struct ThreadData data;
data.array = array;
int tasksPerThread = (ARRAYSIZE+NUMTHREADS-1)/NUMTHREADS;
for (i=0; i < NUMTHREADS; i++) {
start = i * tasksPerThread;
stop = (i+1) * tasksPerThread;
data.start = start;
if (stop >= ARRAYSIZE) {
break;
}
data.stop = stop;
squarer(&data);
}
for (i=0; i < ARRAYSIZE; i++) {
printf("%d\n", i);
}
return 0;
}
我从其他一些答案中借用了代码