3

Cilkで遊んでいますが、同期印刷で問題が発生しています。印刷が遅いため、印刷の同期を維持するのは困難です。例えば...

void ftn(int x)
{
    if (x % 2 == 0)
    {
        std::cout << "printing.. " << x << std::endl;
    }
    else
    {
        cilk_spawn ftn(x/2);
        cilk_spawn ftn(x++);
        cilk_spawn ftn(x*x);

        cilk_sync;
    }

}

ほとんどの場合、印刷は問題ありません。ただし、同期がとれなくなることがあり、別のスレッドからの2番目のprintステートメントが1つのスレッドのprintステートメントの途中で開始されます。

C / Cilk印刷をスレッドセーフにするにはどうすればよいですか?これらが同期していることを確認するにはどうすればよいですか?

4

2 に答える 2

1

複数のスレッドが出力を混同しないようにするために、何らかの形式の相互排除構造 (ロックなど) が必要です。呼び出しの前にロックを取得し、cout後で解放します。私は Cilk に詳しくありませんが、これを行うための構造が必要です。

あなたはただ遊んでいるだけだと言ったので、これはうまくいくはずですが、それ以外の場合、ロックは高価であり、一般的に避けるべきです. ただし、実際のアプリケーションでは、個々のスレッドは通常何も「出力」しません。ほとんどの場合、独立したデータセットで計算を実行するため、説明した問題は発生しません。

于 2010-10-02T14:28:38.970 に答える
1

問題を解決するには、出力ストリームへの書き込みをシリアル化する必要があります。そのために、Cilk Plus は「リデューサー」と呼ばれる高レベルのプリミティブを提供します。具体的には、次を使用する必要がありますreducer_ostream

cilk::reducer<cilk::op_ostream> hyper_cout(std::cout);
*hyper_cout << "Reducer cout:  ";

完全な例は、Cilk Plus Web サイトで入手できます。

于 2015-07-19T11:26:04.837 に答える