我的情况如下:
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()的副本线程?
由于
答案 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之后,子进程将拥有与父进程分开的自己的内存空间。