如何在C / Cilk中以线程安全的方式打印?

时间:2010-10-02 13:34:05

标签: c multithreading string cilk

我正在玩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;
    }

}

在大多数情况下,打印是可以的。但是,它偶尔会失去同步,另一个线程的第二个print语句将在一个线程的print语句中间开始。

如何使C / Cilk打印线程安全?如何确保这些保持同步?

2 个答案:

答案 0 :(得分:1)

您需要某种形式的互斥构造(例如锁定)以防止多个线程混淆其输出 - 在调用cout之前获取锁定并在之后释放它。我不熟悉Cilk,但它应该有结构来做到这一点。

既然你说你只是玩耍,这应该可以正常工作,但除此之外,锁是昂贵的,通常应该避免。但在实际应用程序中,单个线程通常不会“打印”任何内容 - 它们主要是对独立的数据集执行计算 - 因此不会出现您所描述的问题。

答案 1 :(得分:1)

为了解决您的问题,您需要序列化写入输出流。为此,Cilk Plus提供了名为"reducers"的高级原语。具体而言,您需要使用reducer_ostream

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

Cilk Plus网站上提供complete example