1. 在多CPU或多核系统中,多个线程是真正的同时执行
2. 即使单核系统,线程创建一个工作进程,可以使得主进程响应输入,不会冻结主进程
boost.thread
创建 thread 很灵活,只需要是一个 callable, copyable object
函数
functor
同步:
a.join 当前 thread sleep,等待 a 结束
mutex
资源:
多个线程操作的同一个资源
cout cin 也是
rand 在不同线程里面是独立的。
为了有所区别,一种方式是给予不同的seed
另一种办法是定义 Rand class
#include <queue>
#include <string>
#include <cstdlib>
#include <windows.h>
#include <boost/thread.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/thread/mutex.hpp>
#include <iostream>
using namespace std;
using namespace boost;
priority_queue<string> qdl;
mutex mu;
mutex mu_cout;
class Randint
{
public:
 Randint():sd(71) {}
 int get(int maxint);
private:
 int sd;
};
int Randint::get(int maxint)
{
 srand(sd);
 int tmp = rand();
 sd = tmp+197;
 return tmp%(maxint+1);
}
Randint ri;
void adownload(string id)
{
 while(true)
 {
  string url;
  int tt;
  mu.lock();
  if(!qdl.empty())
  {
   url = qdl.top();
   qdl.pop();
  }
  mu.unlock();
  if(!url.empty())
  {
   tt = ri.get(5) + 1;
  }
  else
   break;
  mu_cout.lock();
  cout << id << " start download " << url << ": need " << lexical_cast<string>(tt) << " seconds" << endl;
  mu_cout.unlock();
  Sleep(tt*1000);
  mu_cout.lock();
  cout << id << " finish download " << url << endl;
  mu_cout.unlock();
 }
}
void download()
{
 mu.lock();
 string url;
 int tt;
 if(!qdl.empty())
 {
  url = qdl.top();
  qdl.pop();
  tt = ri.get(5) + 1;
 }
 mu.unlock();
 if(!url.empty())
 {
  mu_cout.lock();
  cout << "start download " << url << ": need " << lexical_cast<string>(tt) << " seconds" << endl;
  mu_cout.unlock();
  Sleep(tt*1000);
  mu_cout.lock();
  cout << "finish download " << url << endl;
  mu_cout.unlock();
 }
}
int main()
{
 qdl.push(string("file")+lexical_cast<string>(ri.get(100)));
 qdl.push(string("file")+lexical_cast<string>(ri.get(100)));
 qdl.push(string("file")+lexical_cast<string>(ri.get(100)));
 qdl.push(string("file")+lexical_cast<string>(ri.get(100)));
 qdl.push(string("file")+lexical_cast<string>(ri.get(100)));
 qdl.push(string("file")+lexical_cast<string>(ri.get(100)));
 qdl.push(string("file")+lexical_cast<string>(ri.get(100)));
 qdl.push(string("file")+lexical_cast<string>(ri.get(100)));
 qdl.push(string("file")+lexical_cast<string>(ri.get(100)));
 qdl.push(string("file")+lexical_cast<string>(ri.get(100)));
 qdl.push(string("file")+lexical_cast<string>(ri.get(100)));
 qdl.push(string("file")+lexical_cast<string>(ri.get(100)));
 thread tdl1(adownload, string("d1"));
 thread tdl2(adownload, string("d2"));
 tdl1.join();
 tdl2.join();
 return 0;
}
 
 
0 comments:
Post a Comment