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();
}
------------------------------------------
#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();
}
相关文章推荐
- 多线程学习之多线程访问共同资源(队列,多线程,锁机制)实例
- 多线程访问共同资源(队列,多线程,锁机制)
- Windows XP 共享 Workgroup无法访问.您可能没有权限使用网络资源
- Effective C++:条款15:在资源管理类提供对原始资源的访问
- xxx无法访问 你可能没有权限使用网络资源.请与这台服务器的管理员联系以查明你是否有访问权限.
- SpringMVC静态资源无法访问的一个奇怪的问题
- ArcGIS for WPF 访问外部资源
- swf不能访问本地资源的解决办法
- SecurityError: Error #2148: SWF 文件 (SWF 文件不能访问本地资源)
- 访问需要HTTP Basic Authentication认证的资源的各种开发语言的实现
- 宽带能连接上,接收不到数据或局域网内某台电脑的共享资源无法访问解决办法
- java线程同步时,不同线程通过不同方法,访问同一资源
- [Android]正确地访问网络资源----Proxy的使用
- 转转转!SpringMVC访问静态资源的三种方式
- assets文件下资源的访问
- C# 多语言资源文件的访问
- 计算机无法访问,您可能没有权限使用网络资源.请与这台服务器的管理员联系以查明您
- jsp访问WEB-INF下面的资源-jsp
- 访问需要HTTP Basic Authentication认证的资源的各种语言的实现
- SpringMVC02静态资源的访问