( Этот вопрос , хотя и похож, но на самом деле не ответил на мой вопрос 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
закончил?). Нужно ли мне использовать это решение?