Автоматически удаляется boost :: thread из boost :: thread_group, когда он завершается ?

( Этот вопрос , хотя и похож, но на самом деле не ответил на мой вопрос stion.)

У меня было проблем с моей собственной реализацией «группы потоков» , и, поскольку я не приблизился к решению или даже идентификации проблемы, я просто использую boost: : thread_grp .

Итак, из той документации, которую я могу найти по теме 1 , я всегда считал, что объекты потоков - независимо от продолжительности их фактической работы - остаются живыми и являются частью группа потоков, пока группа потоков не будет уничтожена.

Однако беглый тест, кажется, показывает, что boost :: thread_group :: size () уменьшается сам по себе, поскольку потоки выполняют свою работу и завершаются. Это означало бы, что сами объекты потока тоже очищаются для меня.

Это правда? Могу ли я на это положиться?

#include 
#include          // for sleep()
#include 

boost::mutex m;
unsigned int count = 0;

void func() {
   boost::mutex::scoped_lock l(m);
   count++;
}

int main()
{
   boost::thread_group grp;
   for (size_t i = 0; i < 300; i++)
      grp.create_thread(func());

   sleep(10);

   assert(count == 300);
   assert(grp.size() == 0);  // passes, in my tests

   // ^ Can I rely on that?
   //   Do I really have no thread objects eating up
   //     memory, at this point?

   grp.join_all();
   // ^ Then I guess this is doing nothing, in this case...
}

Если это так, то вся моя исходная реализация has_threads была просто сломанным клоном, и я зря потратил свое время. :)

И да, assert был действительно плохим выбором для этого фрагмента, поскольку я предполагаю, что это могло привести к тому, что любые маловероятно невыполненные потоки забьют память под тем, что раньше было count ? Во всяком случае, неважно.


1 - Я застрял на Boost 1.40, но документация по этому вопросу, похоже, такая же для более поздних версий.


Обновление

Эта ветка является примером того, как люди говорят противоположное тому, что показало мое тестирование. Тем не менее, это также обеспечивает достойное решение, если это так; приятно, что thread_group полностью потокобезопасен (хотя я не уверен, что этот shared_ptr :: get () потокобезопасен; что, если поток завершится до ] shared_ptr :: reset закончил?). Нужно ли мне использовать это решение?

9
задан Community 23 May 2017 в 12:17
поделиться