次のように定義されたクラスがあります。これは完全ではなく、おそらくコンパイルされません。
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;
};
私の質問は、サーバーという名前の外部クラスを渡すワーカー配列をどのように初期化するかです。
私が欲しいのは、ワーカースレッドのベクトルです。各ワーカー スレッドには独自の状態がありますが、他の共有データにアクセスできます (表示されていません)。また、スレッドを作成するにはどうすればよいですか。クラス オブジェクトが最初に作成されるとき、または外部で thread_group から作成される必要があります。
また、スレッドをクリーンかつ安全にシャットダウンするにはどうすればよいですか?
編集:
次のように 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();
}
誰もこれに問題があると思いますか? 安全なシャットダウンはどうですか?
編集: 私が見つけた問題の 1 つは、Worker オブジェクトが構築されていないように見えることです! おっとっと。はい、Worker クラスにコピー コンストラクターが必要です。
しかし奇妙なことに、スレッドを作成すると、Worker のコピー コンストラクターが複数回呼び出されます。