从主进程的线程启动子进程是否合适?

时间:2017-06-01 04:29:58

标签: c multithreading pthreads fork child-process

我的情况如下:

main()
{
 create a thread executing function thread_func();

 another_func();

}

another_func()
{
  //check something and do something.
  // To do something, create a child process.
  // after creating child process, current thread goes in checking state again
  // child process independently running.
}

thread_func()
{
 infinite loop(); // checking something and doing something
}

使用 pthread 创建线程。 请告诉:在线程中启动上述子进程是否合适?如果这样做会发生什么。

子进程是否创建了自己的另一个执行thread_func()的副本线程?

由于

2 个答案:

答案 0 :(得分:0)

这取决于你想做什么...... 在这里,您的帖子永远不会进入another_func(),因为thread_func()因为infinite_loop()而卡在 class Media(models.Model): Media_Choices= models.CharField(max_length=30, choices=MEDIA_CHOICES) class Parameters(models.Model): user = models.ForeignKey(User) title = models.CharField('title', max_length=100, default='', blank=True, help_text='Use an indicative name, related to the chosen parameters') type = models.CharField('forecast type', choices=FORECAST_TYPES, max_length=20, default="backtest") #input characteristics price_1_min = models.FloatField('1. Price, min', default=0.1, validators=[MinValueValidator(0.1), MaxValueValidator(20000)]) price_1_max = models.FloatField('1. Price, max', default=20000, validators=[MinValueValidator(0.1), MaxValueValidator(20000)]) stocks_num_2_min = models.IntegerField('2. Number of selected stock, min', default=3, validators=[MinValueValidator(0), MaxValueValidator(100)]) stocks_num_2_max = models.IntegerField('2. Number of selected stock, max', default=7, validators=[MinValueValidator(1),]) limit_3 = models.FloatField('3. Last price to upper straight, %', default=20, validators=[MinValueValidator(-200),]) learning_days_4_min = models.IntegerField('4. Number of Learning days, min', default=1, validators=[MinValueValidator(1),MaxValueValidator(30)]) learning_days_4_max = models.IntegerField('4. Number of Learning days, max', default=10, validators=[MinValueValidator(1),MaxValueValidator(30)]) evaluation_days_5 = models.IntegerField('5. Number of Evaluation days', default=10, validators=[MinValueValidator(1),MaxValueValidator(10)]) delay_days_6 = models.IntegerField('6. Number of “no quarterly reports” days (N)', default=10, validators=[MinValueValidator(0),MaxValueValidator(20)]) minimum_gain_7 = models.FloatField('7. Minimum gains for winners', default=0, validators=[MinValueValidator(0),MaxValueValidator(100)]) minimum_loss_8 = models.FloatField('8. Minimum losses for losers', default=0, validators=[MinValueValidator(-100),MaxValueValidator(0)]) total_gain_min_9 = models.FloatField('9. Minimum total gain', default=0, validators=[MinValueValidator(0),MaxValueValidator(100)]) winning_stock_percentage_min_10 = models.FloatField('10. Minimum percentage of winning stocks', default=60, validators=[MinValueValidator(0),MaxValueValidator(100)]) market = models.CharField('Market', max_length=30, null=True) sector= models.ManyToManyField(Media) 中。所以这是你的主程序,它将创建子进程。

答案 1 :(得分:0)

从你的问题不清楚你想做什么。 pthread_create()API接受一个指向void *()类型的函数的指针(void )。实际的线程执行在该线程上,因此如果要在线程上创建子进程,则必须在thread_func()

中进行

如果要使用fork()API(这是linux上的标准方法)创建另一个进程,那么将创建一个单独的进程,其中包含父进程的整个内存空间的副本。但是内存将是虚拟的并且在写入时标记为复制,因此实际上除非您尝试写入内存,否则不会复制内存。

如果在调用fork()之后还调用了exec()或exec()系列中的任何其他API,那么您不需要关心复制的内存。在exec()API之后,子进程将拥有与父进程分开的自己的内存空间。