У меня определен класс, подобный следующему: это не все завершено и, вероятно, не будет компилироваться.
class Server
{
public:
Server();
~Server();
class Worker
{
public:
Worker(Server& server) : _server(server) { }
~Worker() { }
void Run() { }
void Stop() { }
private:
Server& _server;
}
void Run()
{
while(true) {
// do work
}
}
void Stop()
{
// How do I stop the thread?
}
private:
std::vector<Worker> _workers;
};
Мой вопрос: как мне инициализировать рабочий массив, передаваемый во внешний класс с именем Server.
То, что я хочу, это вектор рабочих потоков.Каждый рабочий поток имеет свое собственное состояние, но может получить доступ к некоторым другим общим данным (не показано).Также как мне создавать темы.Должны ли они быть созданы при первом создании объекта класса или извне из группы нитей.
Кроме того, как мне выполнить чистое и безопасное завершение потоков?1011 * Кажется, что я могу инициализировать Worker следующим образом:
Server::Server(int thread_count)
: _workers(thread_count), Worker(*this)), _thread_count(thread_count) { }
И сейчас я делаю это в Server :: Run для создания потоков.
boost::thread_group _threads; // a Server member variable
Server::Run(){
for (int i = 0; i < _thread_count; i++)
_threads.create_thread(boost::bind(&Server::Worker::Run, _workers(i)));
// main thread.
while(1) {
// Do stuff
}
_threads.join_all();
}
Кто-нибудь видиткакие-то проблемы с этим?А как насчет безопасного отключения?
РЕДАКТИРОВАТЬ: Одна проблема, которую я обнаружил с этим, заключается в том, что объекты Worker, кажется, не создаются!упс.Да, мне нужен конструктор копирования в классе Worker.
Но, как ни странно, создание потоков приводит к тому, что конструктор копирования для Worker вызывается несколько раз.