这是我做的测试例子,考虑到一个线程用于去读数据库,一次性插入多条数据到共享数据区,另外搞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;
}