我是编程/ 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;)。
执行示例2
答案 0 :(得分:2)
你所看见的可能原因;
因为您没有指定您正在使用的C ++版本,所以我将假设它的C ++ 11; 根据{{3}}
同步访问同步(§27.5.3.4)标准iostream对象的格式化和未格式化输入(§27.7.2.1)和输出(§27.7.3.1)函数或多个线程的标准C流不得产生数据种族(§1.10)。 [注意:如果用户希望避免交错字符,则仍必须通过多个线程同步这些对象和流的并发使用。 - 结束说明]
这意味着您仍然需要同步两个cout流。 这样做的一种方法是将cout包装在您自己的类中并为其分配互斥锁。