Определить объекты в boost :: shared_ptr - PullRequest
2 голосов
/ 13 мая 2011

Я создаю приложение на основе примера на веб-сайте Boost.Вот соответствующие определения, которые нужно знать:

typedef boost::shared_ptr&lt connection &gt connection_ptr;
std::set&lt connection_ptr&gt connections_;
std::vector&lt boost::shared_ptr&lt boost::thread&gt &gt threads;

, где connection - это класс.

В одном из файлов, connection_manager.cpp , они работают следующим образомthis:

void connection_manager::start(connection_ptr c)
{
  connections_.insert(c);
  c->start();
}

Теперь я хочу запускать каждое новое соединение в отдельном потоке из-за структуры моей программы.Поэтому я изменил вышеизложенное в соответствии с:

void connection_manager::start(connection_ptr c)
{
    boost::shared_ptr&lt boost::thread &gt 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 &lt connection_ptr, boost::shared_ptr &lt boost::thread &gt &gt threads;

Но тогда, как мне создать новый протектор, так же, как и раньше?Как:

boost::shared_ptr &lt boost::thread &gt thread(new boost::thread(
                        boost::bind(&connection::start, c)));

Но каков тогда следующий шаг?Извините за смущение ...: -)

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

Если вы используете карту (или другой ассоциативный контейнер) вместо вектора, вы можете поддерживать связь между соединениями и потоками:

std::map<connection_ptr, boost::shared_ptr<boost::thread> > threads;

позволяет написать:

threads[connection] = thread;

вместо вызова push_back после того, как вы создали поток, а затем:

threads[connection]->stop();

позже, когда вы захотите посмотреть его.

NB: Как общий комментарий, приложения, которые поддерживают 1:1 отображение между потоками и сетевыми соединениями весьма уязвимо для атак отказа в обслуживании (DoS).

1 голос
/ 13 мая 2011

Если ваше соединение всегда связано с потоком, имеет смысл просто указать объект соединения на поток, в котором он выполняется, и перенести логику запуска в потоке на сам класс соединения.

...