У меня есть функция, которая использует четыре потока для работы с разными частями массива, проблема в том, что я не знаю, могу ли я передать массив в подпрограмму потоков, вот пример кода:

#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);
}

Итак, как вы можете видеть в примере, данные1 , данные2 , результат1 , результат2 - это массивы, которые мне нужны. в подпрограмму потока, и я думаю, что передавать ее через структуру нелогично, потому что она будет переписана 4 раза в цикле for().

1
A.nechi 22 Ноя 2017 в 14:03

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;
   …
}
1
Armali 22 Ноя 2017 в 12:06