这是我第一次使用线程,所以如果这是一个糟糕的问题,我很抱歉。输出不应该由“随机”电源和foos组成吗?我得到的似乎是一堆foos和一列主电源。
#include <iostream>
#include <thread>
void foo() {
for (int i = 0; i < 20; ++i) {
std::cout << "foo" << std::endl;
}
}
int main(int argc, char** argv) {
std::thread first(foo);
for (int i = 0; i < 20; ++i) {
std::cout << "main" << std::endl;
}
first.join();
return 0;
}
答案 0 :(得分:2)
有一个开销的开销。所以在这个简单的例子中,输出是完全不可预测的。两个for
循环都运行非常,因此如果线程启动的时间甚至只有一毫秒,则两个代码段都是顺序执行而不是并行执行。但是如果操作系统首先调度线程,则“foo”序列显示在“main”序列之前。
在线程和主函数中插入一些sleep
调用,以查看它们是否真正并行运行。
#include <iostream>
#include <thread>
#include <unistd.h>
void foo() {
for (int i = 0; i < 20; ++i) {
std::cout << "foo" << std::endl;
sleep(1);
}
}
int main(int argc, char** argv) {
std::thread first(foo);
for (int i = 0; i < 20; ++i) {
std::cout << "main" << std::endl;
sleep(1);
}
first.join();
return 0;
}
使用线程不会自动强制执行代码段的并行执行,因为如果你是系统中只有一个CPU,执行在所有进程和线程之间切换,代码段从不并行运行。
有一篇关于threads here的好的维基百科文章。特别是阅读“多线程”部分。
答案 1 :(得分:1)
在cout尝试yield之后。这可能会尊重任何等待的线程。 (虽然依赖于实现)