0

当我执行下面的代码时,shell 输出可能会在线程 0 和线程 1 之间重叠。所以我想问一下,确保每个线程在另一个线程开始输出之前完成输出写入的最佳方法是什么?

这将确保输出是干净的。

提前谢谢了!

    #pragma omp parallel num_threads(2) shared(emperor)
    {
#pragma omp sections
        {
#pragma omp section
            {
                cout << "Open the listening thread by using openmp!"  << endl;
                emperor->startServerListening(); /// does some work
            }
#pragma omp section
            {
                cout << "Open the master thread by using openmp!" << endl;
                emperor->startServerCoupling(); /// does some other work
            }
        } /// End of sections
    } /// End of parallel section
4

1 回答 1

0

最直接的方法是使用临界区,这样一次只有一个线程写入输出:

#pragma omp parallel num_threads(2) shared(emperor)
{
    #pragma omp sections
    {
        #pragma omp section
        {
            #pragma omp critical (cout)
                cout << "Open the listening thread by using openmp!"  << endl;
            emperor->startServerListening(); /// does some work
        }
        #pragma omp section
        {
            #pragma omp critical (cout)
                cout << "Open the master thread by using openmp!" << endl;
            emperor->startServerCoupling(); /// does some other work
        }
    } /// End of sections
} /// End of parallel section

您可以使用命名临界区来识别独占部分,即命名部分对所有具有相同名称的部分是独占的(一次在一个部分中的一个线程)。未命名的部分是所有其他未命名的部分所独有的。

于 2012-09-12T08:14:17.420 回答