【问题标题】:cout not printing string and variable value consistently , misaligning the outputcout 没有一致地打印字符串和变量值,导致输出不对齐
【发布时间】:2018-08-17 12:03:38
【问题描述】:

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

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

注意这是一个 pthread 的工作方法,编译器标志是"-g -Wall -O3 -lpthread"

【问题讨论】:

  • 当您有许多线程都写入同一个 IO 设备时,您无法预测。东西要么需要用互斥锁保护,要么你必须学会​​忍受所有线程相互切断。
  • 这不是线程安全的。您正在为所有线程使用t。并且从未使用过i
  • @codekaizer,不一定,每个线程都可以得到自己的自己的 t。没有看到线程创建代码,我们不知道。在任何情况下,函数中都没有实际更改 t.
  • “我从未使用过。”是的,一些代码被剥离以使其清晰......
  • Near duplicate(至少我的回答涵盖了这个问题)。

标签: c++ newline cout flush


【解决方案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 线程模型。

【讨论】:

  • 非常有趣.. cout 是非原子的。从未知道 。如果可以,请提供互斥代码。这对于其他提出这个问题的人来说可能是一个非常有用的答案。
【解决方案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;
    }
    //...
}

【讨论】:

  • 这个答案比@paxdibalo 的略好,因为它不使用未知变量 &myMutex
  • StackOverflow 似乎充满了很棒的 c/c++ 程序员。现在像魅力一样工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2018-03-08
  • 1970-01-01
相关资源
最近更新 更多