Advertisement
Guest User

Untitled

a guest
Apr 18th, 2011
1,029
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <boost/thread.hpp>
  4. #include <boost/bind.hpp>
  5. #include <queue>
  6. #include <string>
  7. #include <vector>
  8.  
  9. class WorkerManager
  10. {
  11.     boost::thread_group _tg;
  12.     std::queue<std::string> _queue;
  13.     boost::mutex _mutex;
  14.     boost::condition_variable _cvar;
  15.     bool _done;
  16. public:
  17.  
  18.     WorkerManager()
  19.     {
  20.         _done = false;
  21.         for(int i = 0; i < boost::thread::hardware_concurrency(); ++i)
  22.         {
  23.             _tg.create_thread(boost::bind(&WorkerManager::Run, this));
  24.         }
  25.     }
  26.  
  27.     void Join()
  28.     {
  29.         _tg.join_all();
  30.     }
  31.  
  32.     void Run()
  33.     {
  34.         while(true)
  35.         {
  36.             std::string item;
  37.             {
  38.                 boost::mutex::scoped_lock lock(_mutex);
  39.                 while(_queue.empty() && !_done)
  40.                     _cvar.wait(lock);
  41.  
  42.                 if (_queue.empty() && _done)
  43.                     return;
  44.  
  45.                 item = _queue.front();
  46.                 _queue.pop();
  47.             }
  48.  
  49.             Execute(item);
  50.         }
  51.     }
  52.  
  53.     void Execute(std::string s)
  54.     {
  55.         std::cout << "Run: " << s << std::endl;
  56.     }
  57.  
  58.     void Add(std::string item)
  59.     {
  60.         boost::mutex::scoped_lock lock(_mutex);
  61.         _queue.push(item);
  62.         _cvar.notify_one();
  63.     }
  64.  
  65.     void Complete()
  66.     {
  67.         boost::mutex::scoped_lock lock(_mutex);
  68.         _done = true;
  69.         _cvar.notify_one();
  70.     }
  71.  
  72. };
  73.  
  74. int _tmain(int argc, _TCHAR* argv[])
  75. {
  76.     WorkerManager manager;
  77.  
  78.     manager.Add("job");
  79.     manager.Add("job");
  80.     manager.Add("job");
  81.     manager.Add("job");
  82.     manager.Add("job");
  83.     manager.Add("job");
  84.     manager.Add("job");
  85.     manager.Add("job");
  86.     manager.Complete();
  87.     manager.Join();
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement