首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

效仿线程池的有关问题

2012-04-04 
效仿线程池的问题我效仿的线程池,和平常的线程池不大一样。想实现功能。开始创建n个线程。在线程函数中,判断

效仿线程池的问题
我效仿的线程池,和平常的线程池不大一样。
想实现功能。开始创建n个线程。在线程函数中,判断是否有可用资源,退出。但只要有一个线程获取的资源,另外n-1个线程挂起。在线程处理资源时,如果资源过大,拆分,唤醒n-1个线程来处理。故我写了一个管理线程类。一个map保存挂起的线程,一个map保存工作线程。但有个问题,在线程内通过GetCurrentThread获取的handle,经常会获取失败。请问你们在线程池中,是保存什么来操作线程的呢?

[解决办法]
启动线程时,就可以得到handle和线程id了
[解决办法]
安全关闭线程,参考这个帖子
http://topic.csdn.net/u/20111116/16/49927aac-7def-4f5e-8f12-713782750371.html
[解决办法]

探讨
方法我找到了。另外通过线程ID,如何安全的关闭线程呢?

[解决办法]
其实我没看明白为什么你要这样实现,但是线程池原理,核心就是resume 和 suspend减少创建关闭开销,可你又问了要安全退出线程?有点晕。

给你下线程挂起,暂停的代码吧,handle 和int之间可以良好转换的,这不涉及到权限问题,不要进入误区。

给你写了段挂起和唤醒的例子,从线程内部挂起,也可以从线程外部挂起。线程池的作用是根据需求做好如何挂起和唤醒,其实挺简单的,做好同步。

C/C++ code
#include "stdafx.h"#include <Windows.h>#include <iostream>#include <DbgHelp.h>#include <map>using namespace std;#include <process.h>map<int,int>  thread_map;unsigned int __stdcall __thread(void* para){    while(1)    {            int id =GetCurrentThreadId();        SuspendThread((HANDLE)thread_map[id]);            }    _endthread();    return 0;}#pragma comment( lib, "Dbghelp.lib" )LONG __stdcall UnhandledExceptionFilterCall( __in struct _EXCEPTION_POINTERS *ExceptionInfo );int _tmain(int argc, _TCHAR* argv[]){    //SetUnhandledExceptionFilter( UnhandledExceptionFilterCall );    unsigned int threadid = 0;    int handle = _beginthreadex(NULL,0,__thread, 0, 0 ,&threadid);    thread_map[threadid] =handle;    while(1)    {        Sleep(1000);        switch(getchar())        {        case 'r':            {                ResumeThread((HANDLE)handle);            }            break;        case  's':            {                SuspendThread((HANDLE)handle);            }            break;        }    }    system("pause");    return 0;} 

热点排行