对线程感到困惑

时间:2014-03-27 15:24:29

标签: multithreading pthreads

我在C学习线程,我心里有这个理论问题让我发疯。假设以下代码:

1) void main() {
2)     createThread(...); // create a new thread that does "something"
3) }

执行第2行后,会创建两个执行路径。但是我相信在第2行执行之后,它甚至不会影响新线程在第2行创建的内容,因为执行第2行的原始线程将在其下一条指令处结束整个程序。我错了吗?有没有机会原始线程以某种方式被暂停,新线程有机会做某事(假设代码原样,线程之间没有同步或连接操作执行)

3 个答案:

答案 0 :(得分:1)

它可以解决任何问题。如果您有多个核心,则新线程可能会拥有自己的核心。即使您不这样做,调度程序也可能会使新线程优先于现有线程。原始线程在创建新线程后可能会耗尽其时间片。

因此代码创建竞争条件 - 一个线程正在尝试工作,另一个线程正在尝试终止该进程。哪一个获胜将取决于线程实现,硬件,甚至可能是一些随机的机会。

答案 1 :(得分:0)

如果main()在生成的线程之前完成,那么所有这些线程都将被终止,因为没有main()来支持它们。

pthread_exit()结束时调用main()将阻止它并使其保持活动状态以支持它创建的线程,直到它们完成执行。

您可以在此处了解详情:https://computing.llnl.gov/tutorials/pthreads/

答案 2 :(得分:0)

假设您正在使用POSIX pthreads(从您的示例中不清楚)那么您是对的。如果你不想这样那么确实来自main的pthread_exit将意味着程序将继续运行直到所有线程完成。 “主线程”在这方面很特殊,因为它的退出通常会导致所有线程终止。

更典型的是,在分叉新线程后,您将在主线程中执行一些有用的操作。否则,有什么意义呢?因此,您将自己进行处理,等待一些事件等。如果您希望main(或任何其他线程)在继续之前等待线程完成,您可以使用感兴趣的线程的句柄调用pthread_join()

所有这些可能都不合适,但是因为你没有在你的例子中明确使用POSIX线程,所以我不知道这是用于示例或文字代码的伪代码。在Windows中,CreateThread与POSIX pthreads具有不同的语义。但是,您没有在示例中使用该大写字母进行调用,因此我不知道这是否也是您的意图。我个人甚至在Windows上使用pthreads_win32库。