2011-04-23 28 views
0

我启动3个pthread并在运行我的应用程序几次后,我发现根据创建语句的顺序没有确切的线程创建顺序。启动另一个正在运行的线程

一旦某个线程启动后,如何创建另一个线程?

我仍然想从同一个“级别”创建线程,而不是从线程内部创建所需的线程,我想先从头开始。

+0

获取线程开始设置并发对象,然后等待主线程。一旦设置完成,你就知道第一个线程已经启动,你可以开始第二个线程等等。 – forsvarir 2011-04-23 18:50:50

+0

线程的内在本质不是顺序确定的,你应该重新安排你的代码,以便它不重要! – Kevin 2011-04-23 19:06:47

回答

1

线程没有“级别”或父/子关系。包括初始线程主线程在内的所有线程都是对等体。只要线程描述符有效且线程未分离,任何线程都可以在任何其他线程上调用pthread_join

如果确实需要执行排序,最简单的工具是障碍(pthread_barrier_wait)。另一方面,条件变量更强大,但更难使用,并且可能不需要这种情况。

+0

我决定将全局int设置为0,然后在线程内将其设置为1。所以当它设置为1时,我启动另一个线程,因为在我的主循环中我有一个if检查== 1,然后它启动线程。如果存在,我宁愿使用内置函数。 barrier_wait似乎并不正确。 – jarryd 2011-04-23 21:39:27

+0

您的解决方案不正确。您无法读取由不同的线程修改的变量,而无需中间的同步操作,或者结果为UB。 – 2011-04-23 21:44:53

+0

我在最后使用了条件语句pthread_cond_wait等以及互斥体。谢谢 – jarryd 2011-04-24 18:56:18

0

是否可以从线程函数调用调用pthread_create()?

pthread_create创建一个线程,并且正如您发现的那样,它不会调用线程函数。基本上,您的新线程位于活动线程列表中,并且调度程序可以在它选择时给它一个时间片。通常这是几个毫秒,但可以更长。

相关问题