Если я сделаю что-то вроде class myclass : public somelibrary::thread
Означает ли это, что все методы, вызываемые в myclass, будут вызываться в
собственный поток?
Не обязательно. Это зависит от дизайна somelibrary::thread
. Фактически, Boost.Thread не используется таким образом (через наследование). В этом случае вы просто создаете новый объект boost::thread
, передавая вызываемый объект (функторы, указатели функций и т. Д.) В его конструктор.
Однако я не видел ни одной библиотеки потоков, где при вызове какого-либо метода в классе, производном от somelibrary::thread
, создается новый поток. Это требует данных гонок, если не все как-то синхронизировано. Но тогда ваш код будет тратить много времени на ожидание синхронизации примитивов. Не говоря уже о том, что потоки относительно дороги с точки зрения ресурсов операционной системы. В приложении может быть одновременно запущено не более нескольких потоков, при условии, что оно не было разработано идиотом. С другой стороны, методы могут вызываться много-много раз во время работы приложения.
Единственное, что запускается в своем собственном потоке в методе "run" такого
нить?
Не все библиотеки потоков вызывают метод run()
при запуске нового потока. Например, в Boost.Thread
точка входа - operator()()
. Но да, точка входа работает в своем собственном потоке, отдельно от вызывающего потока. Все методы, вызываемые run()
, прямо или косвенно, запускаются во вновь порожденном потоке.
Если только метод run выполняется в своем собственном потоке, что если я захочу
каждый метод вызывается в своем собственном потоке, а не только в этом?
Это почти наверняка не то, что вам действительно нужно в C ++, из-за того, что потоки очень дороги с точки зрения ресурсов операционной системы. Ваша операционная система будет тратить время на распределение и уничтожение потоков. Даже в таких языках, как Erlang , где потоки чрезвычайно дешевы по сравнению с потоками ОС, вы обычно не создаете новый поток для каждого отдельного метода. Программа, выполняющая много потоков или постоянно создающая / уничтожающая потоки, является признаком плохо разработанной программы.
Нужно ли создавать новый поток в каждом методе?
Да, если вы хотите, чтобы каждый метод выполнялся в своем собственном потоке, но, опять же, вы почти наверняка этого не захотите.