2010-10-02 74 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加上網站上。

相關問題