这是我做的测试例子,考虑到一个线程用于去读数据库,一次性插入多条数据到共享数据区,另外搞2个上的线程去读这个共享数据区,以后打算搞个线程池来处理读部分。
目下的问题是我想把这个共享数据区做成可变化的动态区,当读入数据大时,一次读入全部读完。当数据量小时,则在规范范围的空间中运行。
采用vector<mystructData>方式动态变化,比如要删除超过长度之外的设置,只需要earse就可以了,在线程中每次通过begin,end自动扫描处理中数据部分。
如果把线程部分放到dll中,那么考虑到如何读取共享数据区,采用导出函数方式,把主线程中的一个函数地址传入到dll中,然后在这个函数中通过
find_if(a.begin(),a.end(),myfunc)照样可以处理dll中跑线程的问题,之所以考虑用dll分离各个线程部分,是考虑到业务不同时,每个dll处理扫描共享数据区,发现自己的业务就去处理,不是则不理会,这样考虑设计可以通过编写dll方式来扩展不同的业务。
#include "stdafx.h"
#include <vector>
#include <iostream>
#include <windows.h>
#include <process.h>
#include <algorithm>
using namespace std;
struct te
{
int IsGet;
int a1;
int s1;
char b1[20];
};
bool isget(te t)
{
return t.IsGet ==1;
}
bool getdata(te t)
{
return t.IsGet==0;
}
vector<te> a;
HANDLE hMutex;
void myprint(te t)
{
cout<<" ALL "<< (t.IsGet == 0? "Have": "No ")<< "("<<t.a1<<")"<<t.s1<<" " << t.b1 <<endl;
}
DWORD WINAPI insertdata( LPVOID lpParam )
{
vector<te>::iterator p;
int i = 0;
while (1)
{
do{
p = find_if(a.begin(), a.end(), isget);
if (p!= a.end())
{
WaitForSingleObject(hMutex, INFINITE);
i++;
p->IsGet = 0;
p->s1 = i;
sprintf(p->b1, "%s- %d", "thread_insert" , i);
cout<<" insert("<<p->a1<<") " << p->s1<<" " << p->b1 <<endl;
ReleaseMutex(hMutex);
}
//Sleep(1000);
}
while(p != a.end());
WaitForSingleObject(hMutex, INFINITE);
cout<<"---------------------------"<<endl;
for_each(a.begin(), a.end(), myprint);
ReleaseMutex(hMutex);
Sleep(11000);
}
return 0;
}
//读线程,读完对IsGet标志为1
DWORD WINAPI processdata( LPVOID lpParam )
{
vector<te>::iterator p;
while(1)
{
WaitForSingleObject(hMutex, INFINITE);
p = find_if(a.begin(), a.end(), getdata);
if (p != a.end())
{
cout<<"("<< (char*)lpParam << ") get (" << p->a1<<") " << p->s1 <<" " << p->b1 <<endl;
p->IsGet = 1;
p->s1 = 0;
p->b1[0] = '\0';
}
ReleaseMutex(hMutex);
Sleep(500);
}
return 0;
}
int main(int argc, char* argv[])
{
HANDLE hInsertHandle, hProcessHandle1,hProcessHandle2;
DWORD dwThreadId;
te tt1;
for(int i = 0; i < 10;i++)
{
tt1.IsGet = 1; //可以写入标志
tt1.a1 = i;
tt1.s1 = 0;
sprintf(tt1.b1,"%d", i);
a.push_back(tt1);
}
hMutex = CreateMutex(NULL, false, "mutex");
hInsertHandle = CreateThread(
NULL,
0,
insertdata,
NULL, // argument to thread function
0, // use default creation flags
&dwThreadId);
hProcessHandle1 = CreateThread( //读出线程1
NULL,
0,
processdata,
"proc1" ,
0,
&dwThreadId);
hProcessHandle2 = CreateThread(
NULL,
0,
processdata,
"proc2",
0,
&dwThreadId);
while(1)
{
printf("main thread ...\n");
char c = getchar();
if (c== 'q')
break;
}
return 0;
}