0

以下のコードを実行すると、スレッド 0 とスレッド 1 の間でシェル出力が重複する可能性があります。そのため、各スレッドが他のスレッドが出力を開始する前に出力の書き込みを終了するようにする最善の方法は何ですか?

これにより、出力がクリーンであることを確認できます。

よろしくお願いします!

    #pragma omp parallel num_threads(2) shared(emperor)
    {
#pragma omp sections
        {
#pragma omp section
            {
                cout << "Open the listening thread by using openmp!"  << endl;
                emperor->startServerListening(); /// does some work
            }
#pragma omp section
            {
                cout << "Open the master thread by using openmp!" << endl;
                emperor->startServerCoupling(); /// does some other work
            }
        } /// End of sections
    } /// End of parallel section
4

1 に答える 1

0

最も簡単な方法は、クリティカル セクションを使用して、一度に 1 つのスレッドだけが出力に書き込むようにすることです。

#pragma omp parallel num_threads(2) shared(emperor)
{
    #pragma omp sections
    {
        #pragma omp section
        {
            #pragma omp critical (cout)
                cout << "Open the listening thread by using openmp!"  << endl;
            emperor->startServerListening(); /// does some work
        }
        #pragma omp section
        {
            #pragma omp critical (cout)
                cout << "Open the master thread by using openmp!" << endl;
            emperor->startServerCoupling(); /// does some other work
        }
    } /// End of sections
} /// End of parallel section

名前付きクリティカル セクションを使用して、排他的セクションを識別できます。つまり、名前付きセクションは、同じ名前のすべてのセクションに対して排他的です (一度に 1 つのセクションに 1 つのスレッド)。名前のないセクションは、他のすべての名前のないセクション専用です。

于 2012-09-12T08:14:17.420 に答える