Вы, конечно, можете сделать это в конструкторе, но должны знать о проблеме, которая четко объясняется Скоттом Мейерсом в его книгах «Эффективный / более эффективный C ++».
Короче говоря, его точка зрения заключается в том, что если в конструкторе возникает какое-либо исключение, то ваш полуобеспеченный объект не будет уничтожен. Это приводит к утечкам памяти. Поэтому предложение Мейерса состоит в том, чтобы иметь «легкие» конструкторы, а затем выполнять «тяжелую» работу в init
методе, вызываемом после того, как объект был полностью создан.
Этот аргумент не имеет прямого отношения к созданию пула потоков pthread внутри конструктора (в связи с чем вы можете возразить, что исключение не возникнет, если вы просто создадите их, а затем немедленно приостановите их), но является общим соображением о том, что делать в конструкторе. (читайте: передовой опыт).
Еще одно соображение, которое следует сделать, это то, что конструктор не имеет возвращаемого значения. Хотя верно то, что (если не генерируются исключения) вы можете оставить объект в согласованном состоянии, даже если создание потока не удается, возможно, было бы лучше управлять возвращаемым значением с помощью своего рода init
или start
метода.
Вы также можете прочитать эту ветку на SO по этой теме и этот.
person
sergio
schedule
29.06.2012