0

そのため、課題に取り組んでいます。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 ,&parathread);
pthread_create(&work, NULL, play_calculation, &parathread);
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 は未定義です

私たちは何を間違っていますか?誰かが問題を特定するのを手伝ってくれることを願っています.

4

5 に答える 5

2

でインスタンス化する前に定義するstruct必要がありますmain。の後に定義していますmain

于 2012-12-13T13:29:27.443 に答える
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.
于 2012-12-13T13:22:34.590 に答える
0

typedef struct {} s_param の定義をファイルの先頭に移動します。

于 2012-12-13T13:30:23.753 に答える
0

スレッド化に慣れていない場合は、並列化のための高レベルのランタイム ライブラリから始めます。pthread のような低レベルのスレッド化ライブラリは、並列処理の制御を最も低いレベルで公開します。並列処理のアセンブリ言語を表します。そのため、最大限の柔軟性を提供しますが、プログラマーの労力、デバッグ時間、および保守コストの点でコストが高くなります。

オープン ソースの C++ ランタイムは、cilk Plus と TBB です。ビットをダウンロードするためのオープンソースの Web サイトがあります。

www.threadingbuildingblocks.org

www.cilkplus.org

于 2012-12-13T14:39:04.817 に答える
0

あなたの問題はこの行にあると思います。

pthread_create(&play, NULL, work_calculation, &parathread);

正解はこれです。

pthread_create(&work, NULL, &work_calculation, &parathread);

それを両方のスレッドに適用します。

于 2012-12-13T13:25:34.910 に答える