Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在主函数内创建的线程和在函数内创建的线程的行为是否应该不同?_C++_Multithreading - Fatal编程技术网

C++ 在主函数内创建的线程和在函数内创建的线程的行为是否应该不同?

C++ 在主函数内创建的线程和在函数内创建的线程的行为是否应该不同?,c++,multithreading,C++,Multithreading,我是编程/C++新手,我正在试验简单的多线程。我尝试了以下代码: 示例1 #include <iostream> #include <thread> void printFunc() { while(1) { std::cout << "threadOne Running..." << std::endl; } } int m

我是编程/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;
}
#包括
#包括
void printFunc(){
而第(1)款{

std::cout你所看到的可能原因

因为你没有指定你使用的C++版本,所以我假设它是C++ 11; 依照

多线程对同步(§27.5.3.4)标准iostream对象的格式化和非格式化输入(§27.7.2.1)和输出(§27.7.3.1)函数或标准C流的并发访问不得导致数据争用(§1.10)。[注:如果用户希望避免交叉字符,则必须由多个线程同步这些对象和流的并发使用。-结束注]

这意味着您仍然必须同步两个cout流。
一种方法是将cout包装到您自己的类中,并为其分配一个互斥对象。

您可能遇到了一种称为“线程护航”的情况,但这可能会发生在两个程序中,并且应该是相当随机的。唯一的区别是
线程
对象在#2中被销毁。我看不出一旦
分离()已经调用了。尝试了VS中的两个片段,并且两者都产生了随机混乱,没有任何顺序。@ OLVICCICIAL向该屏幕添加了截图。使iNTHORE方法成为内联函数并查看它的行为。我好奇。在阅读了更多关于C++多线程的情况后,尝试了与除<代码>之外的其他一些相同的示例。std::cout
,它表明实际上是
cout流
导致了混乱。谢谢。这并不能解释它。首先,在对@Loga的回复中,没有
cout
导致的混乱。相反,情况恰恰相反,即使它被滥用,它也能在一定程度上运行。其次,你的两个程序都滥用
c以同样的方式输出
,因此这些都不能解释您描述的行为。
#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;
}