线程池究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。可能你也许会问:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的线程不就完了?这也许是个不错的方法,因为它能使得你编写代码相对容易一些,但你却忽略了一个重要的问题??性能!就拿我所在的单位来说,我的单位是一个省级数据大集中的银行网络中心,高峰期每秒的客户端请求并发数超过100,如果为每个客户端请求创建一个新线程的话,那耗费的CPU时间和内存将是惊人的,如果采用一个拥有200个线程的线程池,那将会节约大量的的系统资源,使得更多的CPU时间和内存用来处理实际的商业应用,而不是频繁的线程创建与销毁。 请问如何让线程处于睡眠状态我的想法是
static bool threadflag1=false;//全局变量
static bool threadflag2=false;//全局变量
static bool threadflag3=false;//全局变量
....................................................//创建100个线程标志
while(true)
{
if(threadflag1)
{
.....工作
......完成后 threadflag1=false;
}
else
{
sleep(30);
}
} threadflag 如果true 工作,工作完成了false ,循环休眠现在我理解的笨方法大家还有没有更好的方法给下思路就好
static bool threadflag1=false;//全局变量
static bool threadflag2=false;//全局变量
static bool threadflag3=false;//全局变量
....................................................//创建100个线程标志
while(true)
{
if(threadflag1)
{
.....工作
......完成后 threadflag1=false;
}
else
{
sleep(30);
}
} threadflag 如果true 工作,工作完成了false ,循环休眠现在我理解的笨方法大家还有没有更好的方法给下思路就好
解决方案 »
- ftp下载问题
- 【SOS】ADO 查询ACCESS时不能区分大小写。该怎么区分?
- 如何在MFC中自己画3D效果的单选按钮
- 程序在运行开始时出现 user breakpoint called from code at 0x7c953412 的对话框如何处理?
- 如何在一个由mfc向导生成的单文档程序中加入全局变量啊?
- 求源码
- 不懂COM呀,请教大家
- 有关多线程一问
- 两个问题,关于HBITMAP和SOCK_RAW,高人请进
- 向各位请教,我有个hardware decoder,要播放*.vob文件,之前要做些什么工作??
- vs2005开发程序在本机可正常使用,在其他机器无法运行(在线等)
- vs2010链接错误 LNK1104怎么解决?
如果是Windows/MFC,可以考虑:
1 使用UI线程,需要的时候,只需要PostThreadmessage给线程就可以了
2 使用WaitForSingleObject如果是UNIX/Posix,可以考虑:
1 pthread_cont 进行等待和唤醒
2 使用消息队列接收数据(线程在读“空的”消息队列时,会阻塞,而且消息队列的读取是原子操作,能保证并发安全性)
一,由一个调度器将任务push给线程池中的某一个线程
二,线程池中的每个线程主动抓取未完成的任务
三,两种方式相结合的任务分配算法很现实的一个问题是,线程如何均匀的分布到多个CPU上,
并且避免线程从多个CPU上被移来移去,负载均衡是个难题。
DWORD dwRes,dwStatus;
LPOVERLAPPED lpOverlap = NULL;
while(thread_is_running)
{
BOOL ret = GetQueuedCompletionStatus(hCompletionPort,&dwRes,&dwStatus,&lpOverlap,INFINITE);
if(!ret)
continue; if(lpOverlap == NULL)
return 0xDEAD;
//数据处理...
}
GetQueuedCompletionStatus是阻塞的,直到用
PostQueuedCompletionStatus(hCompletionPort,dwRes,dwStatus,lpOverlap);唤醒线程.这样做的好处是哪个线程会醒过来是系统调度的,PostQueuedCompletionStatus一下,系统会自动唤醒其中一个线程,其他线程继续在等待状态.并且可以传给线程3个参数。
当然必须定义一个LPOVERLAPPED结构稍微麻烦一点,一般是定义一个扩展结构,头一个成员是这个LPOVERLAPPED结构,接下来的成员就可以是自定义要用到的数据结构了。
private 开始新对话框线程()
{
Thread newWindowThread = new Thread(new ThreadStart(ThreadStartingPoint));
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
}
private void ThreadStartingPoint()
{
Window1 newWindow = new Window1();
newWindow.Show();
System.Windows.Threading.Dispatcher.Run();
}void 委托对话框线程处理()
{
Dispatcher.BeginInvoke(DispatcherPriority.Normal,
new 无参数委托(线程处理入口) );
}void 线程处理入口()
{
...
}
看起来,是不是比C++的线程池简单多了?