线程池究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。可能你也许会问:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的线程不就完了?这也许是个不错的方法,因为它能使得你编写代码相对容易一些,但你却忽略了一个重要的问题??性能!就拿我所在的单位来说,我的单位是一个省级数据大集中的银行网络中心,高峰期每秒的客户端请求并发数超过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 ,循环休眠现在我理解的笨方法大家还有没有更好的方法给下思路就好

解决方案 »

  1.   

    用事件内核对象WaitForSingleObject()就可以了,有信号了,线程继续往下执行,否则挂起
      

  2.   

    对啊 用信号量机制啊。我看《深入浅出MFC》中解释的非常好。是属于多个信号量的情况。
      

  3.   

    方法很多,看你使用什么操作系统,采用什么开发标准了
    如果是Windows/MFC,可以考虑:
    1 使用UI线程,需要的时候,只需要PostThreadmessage给线程就可以了
    2 使用WaitForSingleObject如果是UNIX/Posix,可以考虑:
    1 pthread_cont 进行等待和唤醒
    2 使用消息队列接收数据(线程在读“空的”消息队列时,会阻塞,而且消息队列的读取是原子操作,能保证并发安全性)
      

  4.   

    windows核心编程对这部分讲解的很好
      

  5.   

    线程池一般有自己的调度,大致分为两类,
    一,由一个调度器将任务push给线程池中的某一个线程
    二,线程池中的每个线程主动抓取未完成的任务
    三,两种方式相结合的任务分配算法很现实的一个问题是,线程如何均匀的分布到多个CPU上,
    并且避免线程从多个CPU上被移来移去,负载均衡是个难题。
      

  6.   

    windows下可以用重叠端口:hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);然后每个线程等待这个端口:
    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结构,接下来的成员就可以是自定义要用到的数据结构了。
      

  7.   

    现在有C#,基本上不怎么使用线程池了,而是使用"委托",比如在一个WPF应用中,通过这样定义一个对话框:public delegate void 无参数委托();
    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++的线程池简单多了?