Я создаю приложение на основе примера на сайте boost. Вот соответствующие определения, о которых следует знать:
typedef boost::shared_ptr< connection > connection_ptr; std::set< connection_ptr> connections_; std::vector< boost::shared_ptr< boost::thread> > threads;
где соединение - это класс.
В одном из файлов connection_manager .cpp, они делают так:
void connection_manager::start(connection_ptr c) { connections_.insert(c); c->start(); }
Теперь я хочу запускать каждое новое соединение в отдельном потоке из-за структуры моей программы. Итак, я изменил приведенное выше в соответствии с:
void connection_manager::start(connection_ptr c) { boost::shared_ptr< boost::thread > thread(new boost::thread( boost::bind(&connection::start, c))); // push the newely created thread into the vector threads.push_back(thread); // save the connection in our set connections_.insert(c); }
Моя проблема и, следовательно, этот вопрос, когда я хочу только один из этих объектов connection_. В приведенной ранее ссылке они делают следующее:
void connection_manager::stop(connection_ptr c) { connections_.erase(c); c->stop(); // find the connection in among the threads and join that thread }
Но, как следует из комментария выше, как мне найти c среди всех потоков и остановить только этот поток. Я хочу вызвать функцию join () для этого потока.
Обновление:
Думаю, это то, что я действительно хочу иметь! Поэтому я объявляю свою переменную как
std::map < connection_ptr, boost::shared_ptr < boost::thread > > threads;
Но тогда как мне создать новый протектор так же, как и раньше? Нравится:
boost::shared_ptr < boost::thread > thread(new boost::thread( boost::bind(&connection::start, c)));
Но что тогда будет следующим шагом? Извините, что запуталась ... :-)