因此,我们正在努力应对挑战,我们需要并行化c ++代码以确保它使用多个核心而不是一个核心。我们使用openmp,它现在运行得更好。但另一方面,我们需要使用pthread。由于我们对C ++很陌生(实际上它是我们第一次使用它),我们在使线程工作时遇到了一些麻烦。
以下是原始代码的简约版本:
int main(int argc, char **argv) {
...code ...
//These 2 functions should be running in parallel
work_calculation(flights, parameter, alliances);
play_calculation(flights, parameter, alliances);
...code...
}
void work_calculation(vector<Flight>& flights, Parameters& parameters, vector<vector<string> >& alliances)
{
... code ...
do_calculation(flights, parameters, alliances);
... code ...
}
void do_calculation(vector<Flight>& flights, Parameters& parameters,
vector<vector<string> >& alliances)
{
...code...
}
为了将pthread与具有多个参数的函数一起使用,我们发现需要使用struct。所以我们想出了这个:
int main(int argc, char **argv) {
...code ...
s_param parathread;
parathread.flights = flights;
parathread.parameters = parameters;
parathread.alliances = alliances;
pthread_t play;
pthread_t work;
pthread_create(&play, NULL, work_calculation ,¶thread);
pthread_create(&work, NULL, play_calculation, ¶thread);
pthread_join(play, NULL);
pthread_join(work, NULL);
...code...
}
typedef struct
{
vector<Flight> flights;
Parameters parameters;
vector<vector<string> > alliances;
} s_param;
void* work_calculation(void* args)
{
... code ...
struct s_param *paraThread = (struct s_param*)args;
do_calculation(paraThread->flights, paraThread->parameters, paraThread->alliances);
... code ...
pthread_exit(NULL);
}
void do_calculation(vector<Flight>& flights, Parameters& parameters,
vector<vector<string> >& alliances)
{
...code... (same as original)
}
如果我们这样做,我们会收到以下错误:
错误:不允许指向不完整类类型的指针 - &gt;无论我在哪里做paraThread
我们也尝试过struct s_pram * paraThread =(struct s_param *)args =&gt; (所以这样:s_param * paraThread = args;但是我们在编译时会遇到这些错误:
标识符s_param未定义且 标识符paraThread未定义
我们做错了什么?我希望有人能帮我们找到问题。
答案 0 :(得分:2)
在struct
中实例化main
之前,需要先定义main
;你是在{{1}}之后定义的。
答案 1 :(得分:0)
摘录:
typedef struct
{
vector<Flight> flights;
Parameters parameters;
vector<vector<string> > alliances;
} s_param;
创建一个s_param
类型,而不是struct s_param
。 Mike Seymour有正确的答案(使用和定义的顺序不正确),但您仍然需要使用struct
或typedef
。我自己更喜欢typedef,但其他人有其他想法。
你可以使用:
typedef struct {
vector<Flight> flights;
Parameters parameters;
vector<vector<string> > alliances;
} s_param;
:
s_param *something;
或:
struct s_param {
vector<Flight> flights;
Parameters parameters;
vector<vector<string> > alliances;
};
:
struct s_param *something; // I think struct is optional but I still prefer it.
答案 2 :(得分:0)
我认为你的问题就在这条线上。
pthread_create(&play, NULL, work_calculation, ¶thread);
这是正确的。
pthread_create(&work, NULL, &work_calculation, ¶thread);
为两个线程应用它。
答案 3 :(得分:0)
将typedef struct {} s_param的定义移到文件的开头。
答案 4 :(得分:0)
如果您不熟悉线程,我将从更高级别的运行时库开始进行并行化。像pthread这样的低级线程库将并行性控制暴露在最低级别。代表并行的汇编语言。因此,它们提供了最大的灵活性,但在程序员工作量,调试时间和维护成本方面成本很高。
开源C ++运行时是cilk Plus和TBB。他们有一个开源网站可以从中下载位。
www.threadingbuildingblocks.org
www.cilkplus.org