线程是我们编程中使用非常频繁的操作。线程本身难度不大,但实际使用中往往棘手,特别是在大量使用中,会遇到线程间同步、关闭释放、跨线程通讯、启动大量线程时耗时等问题。同时多处使用还会产生大量的冗余代码。下面实现一个静态库来解决线程使用中遇到的问题。
使用时需要载入JCThreadManager.h头文件和引入JCThreadManager.lib。使用过程很简单:1.通过JCThreadManager类创建对象 2.初始化InitManager(线程函数,参数,立刻启动,锁名称)。下面是使用的例子:
int _tmain(int argc, _TCHAR* argv[])
{
JCThreadManager jc0,jc1,jc2,jc3;
//jc0 jc1输出顺序混乱
jc0.InitManager(TestThreadProc0,"test0");
jc1.InitManager(TestThreadProc1,"test1",false);
jc1.Start();//手动启动
Sleep(2000);
jc0.End();//结束线程,IsClose()返回true
jc1.End();
jc1.WaitForClose(2000);
jc0.WaitForClose();//等待结束,默认是INFINITE
getchar();
//jc2 jc3输出顺序正常
jc2.InitManager(TestThreadProc2,"test2",true,"testlock");
jc3.InitManager(TestThreadProc3,"test3",true,"testlock");
Sleep(2000);
//jc2 jc3程序退出自动关闭
return 0;
}
1.首先创建对象:JCThreadManager jc0;
2.初始化线程: jc0.InitManager(TestThreadProc0,"test0");其中TestThreadProc0是线程名称,test0是参数
3.关闭可以根据需要通过End()或者程序结束后自动关闭,使用End()通知线程处于关闭状态,这时线程中IsClose()得到通知,判断时true时就可以return安全退出线程。WaitForClose()是等待关闭的阻塞方法。
4.如果要进行线程同步可以使用锁,InitManager初始化时根据锁名称进行同步。第三个参数是true会直接运行线程,是false需要调用Start()运行。
下面是线程函数定义:
DWORD WINAPI TestThreadProc0(JCThreadManager* pThreadManager)
{
char buf[256]={0};
sprintf(buf,(const char*)pThreadManager->GetParam());
while(true)
{
if (pThreadManager->IsClose())
break;
printf("%s:%d\n",buf,loop++);
}
return 0;
}
其中GetParam()得到传入参数,IsClose()会在调用End()时被通知,就可以安全退出。
下面分别是不使用锁的两个顺序混乱输出,和使用锁后顺序正常输出。
下面提供JCThreadManager和测试源码: