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