Как печатать в многопоточном режиме в C / Cilk? - PullRequest
3 голосов
/ 02 октября 2010

Я играю с 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 поточной?Как я могу гарантировать, что они остаются синхронными?

Ответы [ 2 ]

1 голос
/ 19 июля 2015

Чтобы решить вашу проблему, вам нужно сериализовать запись в выходной поток. Для этой цели Cilk Plus предоставляет высокоуровневые примитивы, называемые "Redurs" . В частности, вам нужно использовать reducer_ostream:

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

A полный пример доступен на веб-сайте Cilk Plus.

1 голос
/ 02 октября 2010

Вам нужна некоторая форма конструкции взаимного исключения (например, блокировка), чтобы предотвратить смешивание вывода несколькими потоками - получить блокировку перед вызовом cout и освободить ее после.Я не знаком с Cilk, но у него должны быть конструкции для этого.

Так как вы сказали, что просто играете, это должно работать нормально, но в противном случае блокировки стоят дорого, и их вообще следует избегать.В приложениях с реальными словами отдельные потоки обычно ничего не «печатают» - они в основном выполняют вычисления на независимых наборах данных - и, следовательно, описанная вами проблема не возникает.

...