boost::thread

 
0
 
C++
ava
iSherhan | 08.06.2011, 06:53
Здравствуйте. Подскажите как и где правильно уничтожить объект потока

В бесконечном цикле при при наступлении определенного события вызывается функция AsyncCall принимающая аргументом указатель на некоторый класс SomeClass*  some
и в которой в отдельном потоке идет вызов функции some->Exec (), работа которой идет длительное время.
работа функции не должна приостанавливать цикл, поэтому создается поток
если создавать стековый вариант то без join() он сразу уничтожается. а если создавать поток
с помощью new, то как, где и когда его уничтожать.






class ThreadAdapter
{
SomeClass* s
public:
  ThreadAdapter(SomeClass*  some): s(some) {}
  void operator()() 
  {
     s->Exec(); //очень долго работающая функция
     delete s;
  }

}

void AsyncCall( SomeClass*  some )
{
   //непонятно как правильно создать поток, чтобы функция не приостанавливала работу

  //если так
  //     boost::thread thrd(ThreadAdapter(some)); 
  // то экземпляр класса потока тут же уничтожится
  //     thrd.join();  - нельзя, т.к выполнение функции остановится ожидая окончания работы потока
   
  //если так
  //     boost::thread*  thrd( new (boost::thread(ThreadAdapter(some))));  -
  //работает, не вызывает остановки цикла,
  // но когда и где уничтожать объект потока? (без уничтожения вызывает утечку памяти)

   


}


int main()
{
  for (;;)
  {
     wait_internal_event();//Стоп, Ждем внешнего события
     AsyncCall( new SomeClass() );     
  }
    

}








Ответы (4)
ava
azesmcar | 08.06.2011, 07:02 #
ava
iSherhan | 08.06.2011, 07:36 #
А можно пример с пояснением, что он делает
ava
azesmcar | 08.06.2011, 08:16 #
Отделяет поток от объекта. Это значит, что при удалении объекта, поток не будет остановлен, хотя для boost::thread в этом нет необходимости, он и так автоматически вызывает detach в деструкторе.
По ссылке все подробно описано.
Цитата


When the boost::thread object that represents a thread of execution is destroyed the thread becomes detached. Once a thread is detached, it will continue executing until the invocation of the function or callable object supplied on construction has completed, or the program is terminated. A thread can also be detached by explicitly invoking the detach() member function on the boost::thread object. In this case, the boost::thread object ceases to represent the now-detached thread, and instead represents Not-a-Thread.


вот пример:

#include <iostream>
#include <boost/thread.hpp>

void async_func(int x)
{
    for (int i = 0; i < 10; ++i)
    {
        std::cout << x << std::endl;
    }
}

void exec_async_func(int x)
{
    boost::thread(async_func, x).detach();
}

int main()
{
    exec_async_func(3);
    std::cin.get();
}
ava
Леопольд | 08.06.2011, 13:18 #
class ThreadAdapter
{
SomeClass* s
public:
  ThreadAdapter(SomeClass*  some): s(some) {}
  void operator()() 
  {
     s->Exec(); //очень долго работающая функция
     delete s;
  }

}
Стоит заменить на boost::bind + boost::shared_ptr
IMHO, если есть под рукой буст, то ручной delete - зло.

Как-то так:

void AsyncCall(boost::shared_ptr<SomeClass> sPtr)
{
  sPtr->Exec();   
}


int main()
{
  for (;;)
  {
     wait_internal_event();//Стоп, Ждем внешнего события
     boost::thread(boost::bind(AsyncCall, boost::make_shared(SomeClass));     
  }
}
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить