Наличие класса, работающего полностью в своем собственном потоке - PullRequest
0 голосов
/ 02 марта 2012

Если я сделаю что-то вроде class myclass : public somelibrary::thread

  1. Все ли методы, вызываемые на myclass, выполняются в своем собственном потоке?
  2. Только run() выполняется в своем собственном потоке?
  3. Для каждого метода, выполняемого в своем собственном потоке, нужно ли создавать новый поток в каждом методе?

1 Ответ

3 голосов
/ 02 марта 2012

Если я сделаю что-то вроде class myclass : public somelibrary::thread Означает ли это, что все методы, вызываемые в myclass, будут вызываться в собственный поток?

Не обязательно. Это зависит от дизайна somelibrary::thread. Фактически, Boost.Thread не используется таким образом (через наследование). В этом случае вы просто создаете новый объект boost::thread, передавая вызываемый объект (функторы, указатели функций и т. Д.) В его конструктор.

Однако я не видел ни одной библиотеки потоков, где при вызове какого-либо метода в классе, производном от somelibrary::thread, создается новый поток. Это требует данных гонок, если не все как-то синхронизировано. Но тогда ваш код будет тратить много времени на ожидание синхронизации примитивов. Не говоря уже о том, что потоки относительно дороги с точки зрения ресурсов операционной системы. В приложении может быть одновременно запущено не более нескольких потоков, при условии, что оно не было разработано идиотом. С другой стороны, методы могут вызываться много-много раз во время работы приложения.

Единственное, что запускается в своем собственном потоке в методе "run" такого нить?

Не все библиотеки потоков вызывают метод run() при запуске нового потока. Например, в Boost.Thread точка входа - operator()(). Но да, точка входа работает в своем собственном потоке, отдельно от вызывающего потока. Все методы, вызываемые run(), прямо или косвенно, запускаются во вновь порожденном потоке.

Если только метод run выполняется в своем собственном потоке, что если я захочу каждый метод вызывается в своем собственном потоке, а не только в этом?

Это почти наверняка не то, что вам действительно нужно в C ++, из-за того, что потоки очень дороги с точки зрения ресурсов операционной системы. Ваша операционная система будет тратить время на распределение и уничтожение потоков. Даже в таких языках, как Erlang , где потоки чрезвычайно дешевы по сравнению с потоками ОС, вы обычно не создаете новый поток для каждого отдельного метода. Программа, выполняющая много потоков или постоянно создающая / уничтожающая потоки, является признаком плохо разработанной программы.

Нужно ли создавать новый поток в каждом методе?

Да, если вы хотите, чтобы каждый метод выполнялся в своем собственном потоке, но, опять же, вы почти наверняка этого не захотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...