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::mutex
和 std::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;
}
//...
}
在下面的代码中 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::mutex
和 std::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;
}
//...
}