我有一個像這樣定義的類:這不是全部完成,可能不會編譯。內部類和初始化
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