使用ZThread访问同一资源,使用互斥加锁和挂起线程,这样对搜索引擎的无限爬取又进了一步。
------------------------------------------
#include "stdafx.h"
#include "zthread/Thread.h"
#include "zthread/Condition.h"
#include "zthread/Mutex.h"
#include "zthread/Guard.h"
#include "zthread/ThreadedExecutor.h"
#include "zthread/Runnable.h"
#include "zthread/CountedPtr.h"
#include <deque>
#include <string>
#include <fstream>
using namespace std;
using namespace ZThread;
ifstream in("string.txt");
static const int cntMaxSize = 5; //放进deque的最大链接数 比如:10000
static const int cntWakeUp = 3; //中间一个状态的唤醒 比如:6000
deque<string> ds;
class CInput:public Runnable
{
private:
Mutex lock;
Condition cond;
bool bInputReady;
public:
CInput():cond(lock)
{
bInputReady = false;
cout<<"t1 join!/n";
}
void InputReady()
{
Guard<Mutex> g(lock);
bInputReady = true;
cond.signal();
}
void run()
{
while(!Thread::interrupted())
{
Guard<Mutex> g(lock);
while(!bInputReady)
{
cond.wait();
}
string s;
while(getline(in,s))
{
ds.push_back(s);
cout<<"Push string /n";
while(ds.size()==cntMaxSize)
{
cond.wait();
}
}
bInputReady = false;
}
}
};
class COutput:public Runnable
{
private:
Mutex lock;
Condition cond;
bool bOutputReady;
public:
COutput():cond(lock)
{
bOutputReady = false;
cout<<"t2 join!/n";
}
~COutput(){}
void OutputReady()
{
Guard<Mutex> g(lock);
bOutputReady = true;
cond.signal();
}
void run()
{
while(!Thread::interrupted())
{
Guard<Mutex> g(lock);
while(!bOutputReady)
{
cond.wait();
}
string str = ds.front();
ds.pop_front();
cout<<str<<endl;
bOutputReady = false;
}
}
};
class CRun:public Runnable
{
private:
Mutex lock;
public:
void run()
{
CInput* input = new CInput;
COutput* output = new COutput;
ThreadedExecutor exe;
exe.execute(input);
exe.execute(output);
while(!Thread::interrupted())
{
Guard<Mutex> g(lock);
if(ds.empty()||ds.size()==cntWakeUp)
{
input->InputReady();
}
if(!ds.empty())
{
output->OutputReady();
}
}
exe.interrupt();
}
};
void main(void)
{
Thread t(new CRun);
cin.get();
t.interrupt();
}