C++ 无法一致打印字符串和变量值,导致输出不一致

C++ 无法一致打印字符串和变量值,导致输出不一致,c++,newline,cout,flush,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 <&l

在以下代码中,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);
}
请注意,在最后一行中,螺纹值为234。但该值永远不会是234。在前2行中,该值没有被追加,因此2,3被添加到此行

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


注意:这是pthread的辅助方法,编译器标志是
“-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);
pthread\u mutex\u lock(&myMutex);

std::cout不要求对
cout
的调用是原子操作。如果需要,可以使用互斥锁简单地保护代码(仅输出代码)

此外,向流中注入
std::endl
已经刷新了数据,因此使用
std::flush
进行后续操作没有什么意义

因此,以最简单的形式:

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

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

std::mutex cout_mutex;

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

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

std::mutex cout_mutex;

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

std::当你有许多线程都在向同一个IO设备写入时,难道你就不能有可预测性吗?这些东西要么需要用互斥锁来保护,要么你必须学会在线程相互切断的情况下生活。这不是线程安全的。你对所有线程都使用
t
。而且
i
从未被使用过。@codekaizer,没有不一定,每个线程都可以得到自己的
t
。如果没有看到线程创建代码,我们就不知道了。在任何情况下,函数中没有任何东西会真正改变
t
“我从来没有被使用过。”是的,一些代码被剥离出来,以使其易读…(至少我的答案涵盖了这个问题)。当你有许多线程都在向同一IO设备写入时,你就不能有可预测性。这些东西要么需要使用互斥锁进行保护,要么你必须学会在线程之间相互切断的情况下生活。这不是线程安全的。你对所有线程都使用
t
。而且
i
从不使用。@codekaizer,不需要当然,每个线程可能都有自己的
t
。如果没有看到线程创建代码,我们就不知道了。在任何情况下,函数中没有任何东西会真正改变
t
“我从未被使用过。”是的,一些代码被剥离出来,以使其易读……(至少我的答案涵盖了这个问题).非常有趣..cout是非原子的。从不知道。如果你能提供一个互斥代码。这可能是对其他人回答这个问题非常有用的答案。非常有趣..cout是非原子的。从不知道。如果你能提供一个互斥代码。这可能是对其他人回答这个问题非常有用的答案。这个答案是sli比@paxdibalo的要好得多,因为它不使用未知变量&myMutexStackOverflow似乎有很多很棒的c/c++程序员。现在就好好工作吧。谢谢。这个答案比@paxdibalo的稍好,因为它不使用未知变量&myMutexStackOverflow似乎有很多很棒的c/c++程序员。现在就好好工作吧。谢谢。