我有一个这样定义的类: 这并不完整,可能无法编译。
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 的外部类的工作人员数组。
我想要的是工作线程的向量。每个工作线程都有自己的状态,但可以访问其他一些共享数据(未显示)。另外,我如何创建线程。它们应该在第一次创建类对象时创建,还是从 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();
}
有人看到这有什么问题吗?以及如何安全关机?
编辑:我发现的一个问题是 Worker 对象似乎没有被构造!哎呀。是的,他们确实需要 Worker 类的复制构造函数。
但奇怪的是,创建线程会导致 Worker 的复制构造函数被多次调用。