( Этот вопрос , хотя и похож, но на самом деле не ответил на мой вопрос.)
У меня были проблемы с моей собственной реализацией "группы потоков" , и, поскольку я не приблизился к решению или даже идентификации проблемы, я изучаю только использование boost::thread_grp
.
Теперь из документации , которую я могу найти по этому вопросу 1 , я всегда считал, что объекты потоков & mdash; независимо от продолжительности их фактической работы & mdash; остаются в живых и являются частью группы потоков, пока группа потоков не будет уничтожена.
Однако поверхностный тест, похоже, показывает, что boost::thread_group::size()
уменьшается сам по себе, поскольку потоки выполняют свою работу и завершают свою работу. Это означало бы, что сами объекты-потоки очищаются и для меня.
Это правда? Могу ли я на это положиться?
#include <cassert>
#include <unistd.h> // for sleep()
#include <boost/thread.hpp>
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
завершится?). Нужно ли использовать это решение?