在main中创建的线程和在函数内创建的线程是否应该表现不同?

时间:2018-04-16 07:53:12

标签: c++ multithreading

我是编程/ C ++的新手,我正在尝试简单的多线程。我尝试过以下代码:

示例1

#include <iostream>
#include <thread>         

void printFunc() {        
    while(1) {        
        std::cout << "threadOne Running..." << std::endl;           
    }
}        

int main() {
    std::thread threadOne(printFunc);            
    threadOne.detach();         

    while(1) {        
        std::cout << "main running..." << std::endl;        
    }
    return 0;
}

示例2

#include <iostream>
#include <thread>         

void printFunc() {        
    while(1) {        
        std::cout << "threadOne running..." << std::endl;            
    }
}        

void initThread() {        
    std::thread threadOne(printFunc);            
    threadOne.detach();         
}         

int main() {        
    initThread();
    while(1) {        
        std::cout << "main running..." << std::endl;        
    }
    return 0;
}

当我在调试和运行中使用Visual Studio运行示例1 时发布模式,它打印&#34;主要运行...&#34;大部分时间和打印&#34; threadOne正在运行......&#34;偶尔。但是当我运行示例2 时,它会打印两个(两个打印之间的跳转&#34;同样地#34;)。

修改
执行例1 Screenshot of execution of example 1

执行示例2

Screenshot of execution of example 2

1 个答案:

答案 0 :(得分:2)

你所看见的可能原因;

因为您没有指定您正在使用的C ++版本,所以我将假设它的C ++ 11; 根据{{​​3}}

  

同步访问同步(§27.5.3.4)标准iostream对象的格式化和未格式化输入(§27.7.2.1)和输出(§27.7.3.1)函数或多个线程的标准C流不得产生数据种族(§1.10)。 [注意:如果用户希望避免交错字符,则仍必须通过多个线程同步这些对象和流的并发使用。 - 结束说明]

这意味着您仍然需要同步两个cout流。 这样做的一种方法是将cout包装在您自己的类中并为其分配互斥锁。