【问题标题】:Pass an array to a thread routine in C将数组传递给 C 中的线程例程
【发布时间】:2017-11-22 11:03:10
【问题描述】:

我有一个函数,它使用四个线程来处理数组的不同部分,问题是,我不知道我应该将数组传递给线程例程,这里是一个代码示例:

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

因此,正如您在示例中看到的那样,data1data2result1result2 是数组我想要线程例程,我认为通过结构传递它是不合逻辑的,因为它在for() 循环中被重写了 4 次。

【问题讨论】:

  • 您的实际问题有点不清楚,也许您可​​以研究一下。使用“不符合逻辑……否则……”毫无意义。不过,我不是母语人士。
  • 将它们放入结构中。它们只是指针,编写它们所需的工作被实际创建线程所需的工作所淹没,并且希望被线程在处理数组的位时使用的周期所淹没。如果是我,无论如何我都会在每次循环时 malloc 每个结构,转储结构数组并完全封装每个线程的数据。这种“为线程结构数据和 pthread_t 声明一个固定数组,然后调用 join()”的设计现在在介绍网站上已经根深蒂固。我希望他们都死得很惨:)

标签: c arrays multithreading


【解决方案1】:

如果您不想通过结构体传递它(通过添加和设置数据和结果的元素),您可以通过全局变量传递它们,例如。 g.

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;
   …
}

【讨论】:

    猜你喜欢
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多