我有一个函数使用四个线程来处理数组的不同部分,我不知道的问题是我应该将数组传递给线程例程,这里是一个代码示例:
#define RANGE_STEP1 1024 / 4
#define QUARTER RANGE_STEP1 / 4
struct thread_data
{
unsigned start;
unsigned stop;
};
#define NUM_THREADS 4
struct thread_data thread_data_array[NUM_THREADS];
pthread_t threads[NUM_THREADS];
void routine(void *thread_info)
{
int n;
unsigned t_start,t_stop;
struct thread_data *mydata;
mydata = (struct thread_data*) thread_info;
t_start = mydata->start;
t_stop = mydata->stop;
for (n = 0; n < RANGE_STEP1; n++)
{
result1[n] = (data1[n] + data2[n])/2; // Error : error: ‘data1’ undeclared (first use in this function) ...
result1[n] = (data1[n] - data2[n])/2; // Error . error: ‘data2’ undeclared (first use in this function) ...
}
pthread_exit(NULL);
}
void foo(float* data1, float* data2,float* result1,float* result2)
{
unsigned t,i=0;
for(t=0;t<RANGE_STEP1;t+=QUARTER)
{
thread_data_array[i].start = t;
thread_data_array[i].stop = t+QUARTER-1;
pthread_create(&threads[i],NULL,routine,(void *)&thread_data_array[i]);
i++;
}
pthread_exit(NULL);
}
因此,正如您在示例中看到的 data1 , data2 , result1 , result2 是数组我想要线程例程,我认为通过结构传递它是不合逻辑的,因为它在for()
循环中被重写了4次。
答案 0 :(得分:1)
如果您不希望通过结构传递它(通过添加和设置数据和结果的元素),您可以通过全局变量传递它们,例如:克。
static float *data1, *data2, *result1, *result2;
void *routine(void *thread_info)
{
…
}
void foo(float *Data1, float *Data2, float *Result1, float *Result2)
{
data1 = Data1, data2 = Data2, result1 = Result1, result2 = Result2;
…
}