cout 不一致地打印字符串和变量值,使输出不对齐

cout not printing string and variable value consistently , misaligning the output

在下面的代码中 threadCount 是 1,2,3,4 之一。但是在输出中,尽管字符串部分得到了完美的打印,但随机丢失了 num 值,并且有时会在几行之后附加它。

void *SPWork(void *t)
{

    int* threadC = (int*)t;
    int threadCount = *threadC;
    cout<<"\n Thread count" << threadCount << endl;
    cout << flush;
    long long int i, adjustedIterationCount;
    adjustedIterationCount = 100/(threadCount);
    for (i=0; i< adjustedIterationCount; i++)
    {
        i++ ;
    }
    pthread_exit((void*) t);
}

输出

......
.....
Thread count1
 Thread count1
 Thread count2
 Thread count1
 Thread count
 Thread count
 Thread count234
 .....
 .....

注意最后一行线程值是 234。但该值永远不会 234.In 前 2 行没有附加值,因此 2,3 被添加到这一行。

我知道它与刷新或附加“\n”有关,尝试了很多组合。但是,问题仍然存在。

N.B。这是 pthread 的 worker 方法,编译器标志是 "-g -Wall -O3 -lpthread"

不要求您对 cout 的调用是原子操作。如果你需要它们是这样的,你可以简单地用互斥锁保护代码(只是输出代码)。

此外,将 std::endl 注入到流中 已经 刷新了数据,因此在 std::flush 之后没有什么意义。

因此,最简单的形式是:

pthread_mutex_lock(&myMutex);
std::cout << "\n Thread count" << threadCount << std::endl;
pthread_mutex_unlock(&myMutex);

请注意,对于最近的 C++ 实现,最好使用 std::mutexstd::lock_guard,因为它们可以保证正确清理(参见其他答案)。由于您的代码中有 pthread_exit(),我假设您仅限于 POSIX 线程模型。

虽然保证标准流是 thread-safe,但不能保证输出不会交错。如果你想以可预测的方式从多个线程打印到标准流,你需要自己做一些同步:

std::mutex cout_mutex;

void *SPWork(void *t)
{
    //...
    {
        std::lock_guard<std::mutex> guard(cout_mutex);
        std::cout << "\n Thread count" << threadCount << std::endl;
    }
    //...
}