C++ C++;std::endl的多线程程序I/O问题

C++ C++;std::endl的多线程程序I/O问题,c++,multithreading,io,C++,Multithreading,Io,我试图学习如何使用C++11线程库,然后,我对下面代码的输出感到困惑 #include <iostream> #include <thread> #include <mutex> std::mutex mtx; void thread_function() { std::cout << "Inside Thread :: ID = " << std::this_thread::get_id() << std::e

我试图学习如何使用C++11线程库,然后,我对下面代码的输出感到困惑

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;

void thread_function()
{
    std::cout << "Inside Thread :: ID = " << std::this_thread::get_id() << std::endl;
}

int main()
{
    std::thread threadObj1(thread_function);
    std::thread threadObj2(thread_function);

    if (threadObj1.get_id() != threadObj2.get_id())
        std::cout << "Both threads have different id" << std::endl;

    threadObj1.join();
    threadObj2.join();
    std::cout<<"From Main Thread :: ID of Thread 1 = "<<threadObj1.get_id()<<std::endl;
    std::cout<<"From Main Thread :: ID of Thread 2 = "<<threadObj2.get_id()<<std::endl;


    return 0;
}

内部线程之前的“/n”似乎消失了。你能帮我弄清楚吗?非常感谢你

您有3个线程正在访问
cout
,而无需任何同步。您已经定义了mtx,但没有使用,为什么

添加锁保护以保护cout语句:

void thread_function()
{
    std::lock_guard<std::mutex> lk{mtx};
    std::cout << "Inside Thread :: ID = " << std::this_thread::get_id() << std::endl;
}

    if (threadObj1.get_id() != threadObj2.get_id())
    {
        std::lock_guard<std::mutex> lk{mtx};
        std::cout << "Both threads have different id" << std::endl;
    }
void thread_函数()
{
std::lock_-guard lk{mtx};

std::cout您有3个线程正在访问
cout
而不进行任何同步。您定义了
mtx
,但没有使用它,为什么

添加锁保护以保护cout语句:

void thread_function()
{
    std::lock_guard<std::mutex> lk{mtx};
    std::cout << "Inside Thread :: ID = " << std::this_thread::get_id() << std::endl;
}

    if (threadObj1.get_id() != threadObj2.get_id())
    {
        std::lock_guard<std::mutex> lk{mtx};
        std::cout << "Both threads have different id" << std::endl;
    }
void thread_函数()
{
std::lock_-guard lk{mtx};
标准::cout
我想我也应该收到三个'\n'对吗

您的输出中有三个有问题的
'\n'
字符。它们位于输出的前三行的末尾

我想你可能误解了你例子中这句话的意思:

std::cout << "Inside Thread :: ID = " << std::this_thread::get_id() << std::endl;
std::cout
我想我也应该收到三个'\n'对吗

您的输出中有三个有问题的
'\n'
字符。它们位于输出的前三行的末尾

我想你可能误解了你例子中这句话的意思:

std::cout << "Inside Thread :: ID = " << std::this_thread::get_id() << std::endl;

std::cout代码中的
'\n'
在哪里?
threadObj1.get\id()
threadObj1.join()
之后就没用了。对此我很抱歉。看来这不是问题。@S.M.“std:endl”将刷新并输出一个'\n'字符。代码中的
'\n'
在哪里?
threadObj1.get\id()
threadObj1.join()之后无效<代码> >我很抱歉。这似乎不是问题。@ S.M.的STD:Endl将刷新并输出一个字符‘n’。谢谢您的解释。我是C++多线程程序中的一个新的。我能理解这个问题是由竞争条件引起的吗?然而,即使三个线程没有同步地访问CUT。,我想我也应该收到三个'\n'对吗?@Sean这里没有数据争用,因为
std::cout
是线程安全的。但是您正在向
std::cout
发出多条写指令,并且输出被交错。一个线程在另一个线程打印其文本之后,但在其运行之前写入
std::cout
std::endl
@Galik那么,我们不能将这种行为称为控制台输出的数据竞争吗?在程序的正常运行中,我们希望看到一行接一行,而不是交错的行。@rafix07从技术上讲,我们这里所说的是“竞争条件”,而不是“数据竞争”这是一个解释差异的链接:谢谢你的解释。我是C++多线程程序中的一个新的。我能理解这个问题是由竞争条件引起的吗?然而,即使三个线程没有同步地访问CUT,我也应该接收三’\n’右??肖恩没有数据竞争H。这是因为
std::cout
是线程安全的。但是您正在向
std::cout
发出多条写入指令,并且输出被交错。一个线程在另一个线程打印其文本之后,但在其
std::endl
之前写入
t控制台输出?在程序正常运行时,我们希望看到一行接一行,而不是交错的行。@rafix07从技术上讲,我们这里所说的是“竞争条件”,而不是“数据竞争”,这里有一个链接来解释区别:首先感谢您耐心的解释。我知道您的意思是我对“std::cout”的调用是交错在一起的,顺序与上面显示的一样。还有一个问题。我如何避免这种情况?因此,我可以使用互斥锁将数据锁定到标准输出,以确保只有一个线程可以访问标准输出。对吗?首先感谢您耐心的解释。我知道w你的意思是,我对“std::cout”的调用交错在一起,顺序与上面显示的一样。还有一个问题。我如何避免这种情况?因此,我可以使用互斥锁将数据锁定到标准输出,以确保只有一个线程可以访问标准输出。对吗?