【问题标题】:How to print in a thread-safe manner in C/Cilk?如何在 C/Cilk 中以线程安全的方式打印?
【发布时间】:2023-03-11 13:53:01
【问题描述】:

我正在玩 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 打印线程安全?如何确保这些保持同步?

【问题讨论】:

    标签: c multithreading string cilk


    【解决方案1】:

    您需要某种形式的互斥结构(例如锁)来防止多个线程混淆它们的输出 - 在调用 cout 之前获取锁并在之后释放它。我对 Cilk 不熟悉,但它应该具有执行此操作的构造。

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

    【讨论】:

      【解决方案2】:

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

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

      Cilk Plus 网站上提供了complete example

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-03
        • 1970-01-01
        • 1970-01-01
        • 2011-12-14
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        相关资源
        最近更新 更多