一种实用的c++线程管理方式

         线程是我们编程中使用非常频繁的操作。线程本身难度不大,但实际使用中往往棘手,特别是在大量使用中,会遇到线程间同步、关闭释放、跨线程通讯、启动大量线程时耗时等问题。同时多处使用还会产生大量的冗余代码。下面实现一个静态库来解决线程使用中遇到的问题。

         使用时需要载入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和测试源码:

GitHub: https://github.com/ljc2266/JCThreadManager.git

CSDN:https://download.csdn.net/download/u011736517/12191005

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章