在以下代码中,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"
答案 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::mutex
和std::lock_guard
,因为它们可以保证正确清理(请参阅其他答案)。由于您的代码中有pthread_exit()
,因此我假设您仅限于POSIX线程模型。