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