线程连接c ++行为

时间:2016-08-11 10:44:28

标签: c++ multithreading

如果我正在与join()同步线程,请考虑加入调用的顺序,为什么有时会在t1之后看到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;
}

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

4 个答案:

答案 0 :(得分:9)

join会影响您调用join的当前主题,而不会影响已加入的主题。

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

在您的示例中,无法保证线程t1t2中的哪一个将首先运行并完成。唯一的保证是主线程首先等待t1,然后等待t2,然后将消息记录到stdout。

答案 1 :(得分:1)

电话的顺序并不意味着您的输出将以相同的方式排序,并且因为您在&#34;同一时间执行线程&#34;你无法控制在CPU中首先执行指令。

如果你需要强迫t1在t2之前制作一些东西,只需使用Semaphores

答案 2 :(得分:1)

join对其应用的线程没有任何影响。它只是阻塞调用它的线程,直到它应用的线程完成,然后继续执行。因此,调用join的顺序对线程的运行顺序没有任何作用。

顺便提一下,

std::thread t1(callFromthread, 1);
if (t1.joinable()) t1.join();

测试是多余的。除非您致电detach,否则std::thread个对象可以加入。

答案 3 :(得分:1)

加入的顺序并不决定或影响线程的执行顺序。因此,两个线程的输出可以是任何顺序(或交错)。