为什么不在这段代码中线程似乎并行运行?

时间:2014-04-07 07:35:20

标签: c++ multithreading

这是我第一次使用线程,所以如果这是一个糟糕的问题,我很抱歉。输出不应该由“随机”电源和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;
}

2 个答案:

答案 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之后。这可能会尊重任何等待的线程。 (虽然依赖于实现)