线程连接c ++行为

wul*_*pro 7 c++ multithreading

如果我正在同步线程join(),考虑到加入调用的顺序,为什么我有时会看到t1after 的输出t2

#include <thread>

void callFromThread(int id) {
    int i = 1000;
    while(i != 0) {
        printf("%s %d\n", "hi from thread", id);
        i--;
    }
}

int main(void) {
    std::thread t1 (callFromThread, 1);
    std::thread t2 (callFromThread, 2);

    t1.join();
    t2.join();

    printf("%s\n", "bye from main!");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我在连接调用之前的开头有一些交错,接着是所有剩余的t1输出,接着是剩余的t2输出,我可以理解行为.但是,相反,我看到所有t2然后都是t1,反之亦然.

Dav*_*aim 9

join影响您调用的当前线程join,而不是连接的线程.

基本上,join使当前线程等待另一个线程完成执行.它对计划运行其他线程的时间或与其他线程相比的顺序没有影响.

在你的榜样,也不能保证它的线程t1t2运行,并首先完成.唯一的保证是主线程先等待t1,然后等待t2,然后将消息记录到stdout.

  • 可能因为函数太小,一个线程在操作系统调度其他线程之前完成.如果你增加`i`,让我们说'10'000'000`你可能会看到它们交错 (3认同)