【发布时间】: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);
}
因此,正如您在示例中看到的那样,data1、data2、result1、result2 是数组我想要线程例程,我认为通过结构传递它是不合逻辑的,因为它在for() 循环中被重写了 4 次。
【问题讨论】:
-
您的实际问题有点不清楚,也许您可以研究一下。使用“不符合逻辑……否则……”毫无意义。不过,我不是母语人士。
-
将它们放入结构中。它们只是指针,编写它们所需的工作被实际创建线程所需的工作所淹没,并且希望被线程在处理数组的位时使用的周期所淹没。如果是我,无论如何我都会在每次循环时 malloc 每个结构,转储结构数组并完全封装每个线程的数据。这种“为线程结构数据和 pthread_t 声明一个固定数组,然后调用 join()”的设计现在在介绍网站上已经根深蒂固。我希望他们都死得很惨:)
标签: c arrays multithreading