您的位置:首页 > 其它

ZThread的访问共同资源

2006-03-13 00:48 253 查看
使用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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: