c – 内部类和初始化
发布时间:2020-12-16 06:55:06 所属栏目:百科 来源:网络整理
导读:我有一个这样定义的类:这不是全部完成,可能无法编译. class Server{public: Server(); ~Server(); class Worker { public: Worker(Server server) : _server(server) { } ~Worker() { } void Run() { } void Stop() { } private: Server _server; } void Ru
我有一个这样定义的类:这不是全部完成,可能无法编译.
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的外部类中传递的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(); } 有没有人看到这个问题? 编辑: 但奇怪的是,创建线程会导致多次调用Worker的复制构造函数. 解决方法
我用纯WINAPI做了,看看:
#include <stdio.h> #include <conio.h> #include <windows.h> #include <vector> using namespace std; class Server { public: class Worker { int m_id; DWORD m_threadId; HANDLE m_threadHandle; bool m_active; friend Server; public: Worker (int id) { m_id = id; m_threadId = 0; m_threadHandle = 0; m_active = true; } static DWORD WINAPI Run (LPVOID lpParam) { Worker* p = (Worker*) lpParam; // it's needed because of the static modifier while (p->m_active) { printf ("I'm a thread #%in",p->m_id); Sleep (1000); } return 0; } void Stop () { m_active = false; } }; Server () { m_workers = new vector <Worker*> (); m_count = 0; } ~Server () { delete m_workers; } void Run () { puts ("Server is run"); } void Stop () { while (m_count > 0) RemoveWorker (); puts ("Server has been stopped"); } void AddWorker () { HANDLE h; DWORD threadId; Worker* n = new Worker (m_count ++); m_workers->push_back (n); h = CreateThread (NULL,Worker::Run,(VOID*) n,CREATE_SUSPENDED,&threadId); n->m_threadHandle = h; n->m_threadId = threadId; ResumeThread (h); } void RemoveWorker () { HANDLE h; DWORD threadId; if (m_count <= 0) return; Worker* n = m_workers->at (m_count - 1); m_workers->pop_back (); n->Stop (); TerminateThread (n->m_threadHandle,0); m_count --; delete n; } private: int m_count; vector <Worker*>* m_workers; }; int main (void) { Server a; int com = 1; a.Run (); while (com) { if (kbhit ()) { switch (getch ()) { case 27: // escape key code com = 0; break; case 'a': // add worker a.AddWorker (); break; case 'r': // remove worker a.RemoveWorker (); break; } } } a.Stop (); return 0; } 这里没有同步代码,因为我没有时间去做…但我希望它会帮助你=) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
推荐文章
站长推荐
热点阅读