2010-10-02 70 views
3

我在玩Cilk,并且遇到了与打印同步的问题。打印速度慢,所以很难保持打印同步。例如...如何在C/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; 
    } 

} 

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

如何让C/Cilk印刷线程安全?我如何确保这些保持同步?

回答

1

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

既然你说你只是在玩耍,这应该很好,但否则,锁是昂贵的,通常应该避免。尽管如此,在实际的应用程序中,单个线程通常不会“打印”任何东西 - 它们通常会对独立的数据集执行计算 - 因此您所描述的问题不会出现。

1

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

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

一个complete example是可用的Cilk加上网站上。