Сколько потоков я могу порождать, используя boost в c ++? - PullRequest
8 голосов
/ 15 октября 2010

И что происходит, когда я пытаюсь создать слишком много?

Я получаю следующую ошибку, когда создаю более 900 потоков:

terminate called after throwing an instance of 'dining 1
boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::thread_resource_error>
 >dining 3
'
dining 2
  what():  dining 4
boost::thread_resource_errordining 3

Это ожидаемая ошибкав результате попытки создать слишком много потоков?

Ответы [ 4 ]

9 голосов
/ 15 октября 2010

Помните, что каждый поток должен зарезервировать пространство стека. Вот почему существует ограничение на количество потоков, которые вы можете создавать. Похоже, что вы либо достигаете этого предела, либо повышение мешает вам достичь этого предела.

Вот ссылка на самую последнюю документацию по Boost, в которой документируется наблюдаемое вами поведение (исключение выдается): Документация по Boost Thread (найдите на этой странице boost :: thread_resource_error)

4 голосов
/ 15 октября 2010

Сколько вы можете породить, зависит от ограничений вашей операционной среды.И да, boost::thread_resource_error - это то, что вы должны ожидать, когда он не может получить необходимые ресурсы потоков, которые ему необходимы, согласно документации

1 голос
/ 15 октября 2010

Вы достигли жесткого предела. Как уже говорили другие, могут быть два ограничения:

  • количество потоков, которые может породить процесс, ограничено ОС (глобально или для процесса)
  • доступная память ограничена, и каждый поток резервирует свой собственный стек (обычно несколько МБ и 4 МБ * 900 -> 3,6 Го)

Кстати, это то, что так интересно в процедурах Google Go. Вместо того, чтобы создавать как можно больше потоков, среда выполнения Go адаптирует количество потоков к числу доступных ядер и вручную мультиплексирует подпрограммы в этих физических потоках.

Кроме того, подпрограммы являются легковесными (резервируя только 4 КБ каждая), потому что они не используют традиционный стек (исчезновение переполнения стека!), Что означает, что вы можете эффективно охватить несколько тысяч подпрограмм на обычной машине, и это не будет стоить вам дорого.

Если вы хотите поэкспериментировать с крайним параллелизмом:

  • Узнайте, как уменьшить пространство стека, выделенное для потока (остерегайтесь переполнения стека)
  • переключитесь на Go или найдите другой язык, реализующий подпрограммы
0 голосов
/ 15 октября 2010

Существуют ограничения операционной системы. В основном это будет зависеть от того, сколько памяти у вас в системе. Если я правильно помню, каждому потоку pthread отводится минимум 32 мегабайта памяти. По умолчанию намного больше.

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