如果我正在与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,反之亦然。
答案 0 :(得分:9)
join
会影响您调用join
的当前主题,而不会影响已加入的主题。
基本上,join使当前线程等待另一个线程完成执行。它对计划运行其他线程的时间或与其他线程相比的顺序没有影响。
在您的示例中,无法保证线程t1
和t2
中的哪一个将首先运行并完成。唯一的保证是主线程首先等待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)
加入的顺序并不决定或影响线程的执行顺序。因此,两个线程的输出可以是任何顺序(或交错)。