我有一个像这样定义的类:这不是全部完成,可能不会编译。内部类和初始化
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的外部创建。
另外,我该如何干净而安全地关闭线程?
编辑:
看来,我可以这样初始化工作人员:
Server::Server(int thread_count)
: _workers(thread_count), Worker(*this)), _thread_count(thread_count) { }
而且目前我在做这在服务器::运行以创建线程。
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();
}
有没有人看到这个问题? 安全关机如何?
编辑: 我发现它的一个问题是,工人对象似乎并不构建! oops。是的,他们确实需要Worker类的复制构造函数。
但奇怪的是,创建线程会导致多次调用Worker的复制构造函数。
输入队列从哪里来?你想创造多少工人? – 2010-11-09 10:15:46
我已经删除了输入队列。我认为它会让事情混淆。如果我想创建的工作人员数量是可变的并且来自配置文件。 – Matt 2010-11-09 10:20:12
你真的需要在另一个类中定义一个类吗?它只会让我对它不那么可读。 – 2010-11-09 10:25:47