そのため、課題に取り組んでいます。C++ コードを並列化して、1 つだけではなく複数のコアを使用するようにする必要があります。これにはopenmpを使用しましたが、現在ははるかに優れています。しかし、別の部分では pthread を使用する必要があります。私たちは C++ に非常に慣れていないため (実際に 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 を使用するには、構造体を使用する必要があることがわかりました。そこで、次のように考えました。
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)
}
このようにすると、次のエラーが発生します。
エラー: 不完全なクラス型へのポインタは許可されていません -> どこでも paraThread を実行します
また、 struct s_pram *paraThread = (struct s_param*)args => で構造体なしで試してみました (このように: s_param *paraThread = args; ですが、コンパイル中にこれらのエラーが発生します:
識別子 s_param は未定義であり、識別子 paraThread は未定義です
私たちは何を間違っていますか?誰かが問題を特定するのを手伝ってくれることを願っています.