cout不能始终如一地打印字符串和变量值,从而使输出不对齐

时间:2018-03-09 00:44:42

标签: c++ newline cout flush

在以下代码中,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.在前两行中,该值没有被追加,因此2,3被添加到该行。

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

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

2 个答案:

答案 0 :(得分:2)

虽然标准流保证是线程安全的,但无法保证输出不会交错。如果要以可预测的方式从多个线程打印到标准流,则需要自己进行一些同步:

std::mutex cout_mutex;

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

答案 1 :(得分:1)

不要求您对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线程模型。