当前位置: 首页 > news >正文

php笑话网站源码小程序开发兼职的小知识

php笑话网站源码,小程序开发兼职的小知识,什么样的网站开发比较吃香,莱芜金点子信息港最新招聘http://blog.csdn.net/wzjking0929/article/details/20312675 线程池#xff1a;简单地说#xff0c;线程池 就是预先创建好一批线程#xff0c;方便、快速地处理收到的业务。比起传统的到来一个任务#xff0c;即时创建一个线程来处理#xff0c;节省了线程的创建和回收的…http://blog.csdn.net/wzjking0929/article/details/20312675 线程池简单地说线程池 就是预先创建好一批线程方便、快速地处理收到的业务。比起传统的到来一个任务即时创建一个线程来处理节省了线程的创建和回收的开销响应更快效率更高。 在linux中使用的是posix线程库首先介绍几个常用的函数 1 线程的创建和取消函数 pthread_create 创建线程 pthread_join 合并线程 pthread_cancel 取消线程 2 线程同步函数 pthread_mutex_lock pthread_mutex_unlock pthread_cond_signal pthread_cond_wait 关于函数的详细说明参考man手册 线程池的实现 线程池的实现主要分为三部分线程的创建、添加任务到线程池中、工作线程从任务队列中取出任务进行处理。 主要有两个类来实现CTask,CThreadPool /** 执行任务的类设置任务数据并执行 **/ C代码   class CTask   {   protected:    string m_strTaskName;  //任务的名称    void* m_ptrData;       //要执行的任务的具体数据   public:    CTask(){}    CTask(string taskName)    {     this-m_strTaskName  taskName;     m_ptrData  NULL;    }    virtual int Run() 0;    void SetData(void* data);    //设置任务数据   };   任务类是个虚类所有的任务要从CTask类中继承 实现run接口run接口中需要实现的就是具体解析任务的逻辑。m_ptrData是指向任务数据的指针可以是简单数据类型也可以是自定义的复杂数据类型。 线程池类 /** 线程池 **/ Java代码   class CThreadPool   {   private:    vectorCTask* m_vecTaskList;         //任务列表    int m_iThreadNum;                            //线程池中启动的线程数               static vectorpthread_t m_vecIdleThread;   //当前空闲的线程集合    static vectorpthread_t m_vecBusyThread;   //当前正在执行的线程集合    static pthread_mutex_t m_pthreadMutex;    //线程同步锁    static pthread_cond_t m_pthreadCond;    //线程同步的条件变量   protected:    static void* ThreadFunc(void * threadData); //新线程的线程函数    static int MoveToIdle(pthread_t tid);   //线程执行结束后把自己放入到空闲线程中    static int MoveToBusy(pthread_t tid);   //移入到忙碌线程中去    int Create();          //创建所有的线程   public:    CThreadPool(int threadNum);    int AddTask(CTask *task);      //把任务添加到线程池中    int StopAll();   };   当线程池对象创建后启动一批线程并把所有的线程放入空闲列表中当有任务到达时某一个线程取出任务并进行处理。 线程之间的同步用线程锁和条件变量。 这个类的对外接口有两个 AddTask函数把任务添加到线程池的任务列表中并通知线程进行处理。当任务到到时把任务放入m_vecTaskList任务列表中并用pthread_cond_signal唤醒一个线程进行处理。 StopAll函数停止所有的线程 Cpp代码   ************************************************      代码:      ××××××××××××××××××××CThread.h             #ifndef __CTHREAD   #define __CTHREAD   #include vector   #include string   #include pthread.h      using namespace std;      /**  执行任务的类设置任务数据并执行  **/   class CTask   {   protected:    string m_strTaskName;  //任务的名称    void* m_ptrData;       //要执行的任务的具体数据   public:    CTask(){}    CTask(string taskName)    {     this-m_strTaskName  taskName;     m_ptrData  NULL;    }    virtual int Run() 0;    void SetData(void* data);    //设置任务数据   };      /**  线程池  **/   class CThreadPool   {   private:    vectorCTask* m_vecTaskList;         //任务列表    int m_iThreadNum;                            //线程池中启动的线程数               static vectorpthread_t m_vecIdleThread;   //当前空闲的线程集合    static vectorpthread_t m_vecBusyThread;   //当前正在执行的线程集合    static pthread_mutex_t m_pthreadMutex;    //线程同步锁    static pthread_cond_t m_pthreadCond;    //线程同步的条件变量   protected:    static void* ThreadFunc(void * threadData); //新线程的线程函数    static int MoveToIdle(pthread_t tid);   //线程执行结束后把自己放入到空闲线程中    static int MoveToBusy(pthread_t tid);   //移入到忙碌线程中去    int Create();          //创建所有的线程   public:    CThreadPool(int threadNum);    int AddTask(CTask *task);      //把任务添加到线程池中    int StopAll();   };      #endif                           类的实现为      ××××××××××××××××××××CThread.cpp             #include CThread.h   #include string   #include iostream      using namespace std;      void CTask::SetData(void * data)   {    m_ptrData  data;   }      vectorpthread_t CThreadPool::m_vecBusyThread;   vectorpthread_t CThreadPool::m_vecIdleThread;   pthread_mutex_t CThreadPool::m_pthreadMutex  PTHREAD_MUTEX_INITIALIZER;   pthread_cond_t CThreadPool::m_pthreadCond  PTHREAD_COND_INITIALIZER;      CThreadPool::CThreadPool(int threadNum)   {    this-m_iThreadNum  threadNum;    Create();   }   int CThreadPool::MoveToIdle(pthread_t tid)   {    vectorpthread_t::iterator busyIter  m_vecBusyThread.begin();    while(busyIter ! m_vecBusyThread.end())    {     if(tid  *busyIter)     {      break;     }     busyIter;    }    m_vecBusyThread.erase(busyIter);    m_vecIdleThread.push_back(tid);    return 0;   }      int CThreadPool::MoveToBusy(pthread_t tid)   {    vectorpthread_t::iterator idleIter  m_vecIdleThread.begin();    while(idleIter ! m_vecIdleThread.end())    {     if(tid  *idleIter)     {      break;     }     idleIter;    }    m_vecIdleThread.erase(idleIter);    m_vecBusyThread.push_back(tid);    return 0;   }   void* CThreadPool::ThreadFunc(void * threadData)   {    pthread_t tid  pthread_self();    while(1)    {     pthread_mutex_lock(m_pthreadMutex);     pthread_cond_wait(m_pthreadCond,m_pthreadMutex);     cout  tid:  tid   run  endl;     //get task     vectorCTask** taskList  (vectorCTask**)threadData;     vectorCTask*::iterator iter  taskList-begin();     while(iter ! taskList-end())     {            MoveToBusy(tid);      break;     }     CTask* task  *iter;     taskList-erase(iter);     pthread_mutex_unlock(m_pthreadMutex);     cout  idel thread number:  CThreadPool::m_vecIdleThread.size()  endl;     cout  busy thread number:  CThreadPool::m_vecBusyThread.size()  endl;     //cout  task to be run:  taskList-size()  endl;     task-Run();          //cout  CThread::thread work  endl;     cout  tid:  tid   idle  endl;         }    return (void*)0;   }      int CThreadPool::AddTask(CTask *task)   {    this-m_vecTaskList.push_back(task);    pthread_cond_signal(m_pthreadCond);    return 0;   }   int CThreadPool::Create()   {    for(int i  0; i  m_iThreadNum;i)    {     pthread_t tid  0;     pthread_create(tid,NULL,ThreadFunc,m_vecTaskList);     m_vecIdleThread.push_back(tid);    }    return 0;   }      int CThreadPool::StopAll()   {    vectorpthread_t::iterator iter  m_vecIdleThread.begin();    while(iter ! m_vecIdleThread.end())    {     pthread_cancel(*iter);     pthread_join(*iter,NULL);     iter;    }       iter  m_vecBusyThread.begin();    while(iter ! m_vecBusyThread.end())    {     pthread_cancel(*iter);     pthread_join(*iter,NULL);     iter;    }        return 0;   }      简单示例      ××××××××test.cpp      #include CThread.h   #include iostream      using namespace std;      class CWorkTask: public CTask   {   public:    CWorkTask()    {}    int Run()    {     cout  (char*)this-m_ptrData  endl;     sleep(10);     return 0;    }   };   int main()   {    CWorkTask taskObj;    char szTmp[]  this is the first thread running,haha success;    taskObj.SetData((void*)szTmp);    CThreadPool threadPool(10);    for(int i  0;i  11;i)    {     threadPool.AddTask(taskObj);    }    while(1)    {     sleep(120);    }    return 0;   }
http://wiki.neutronadmin.com/news/144448/

相关文章:

  • 电子商务企业网站建设规划方案成立广告公司需要什么条件
  • 怎样在微信中做网站wordpress 火车头发布
  • 网站建设 坚持实用原则建设直播网站需要哪些许可证
  • 建立网站的正确方法找回原来的百度
  • 哈尔滨 网站建设网站seo外链平台
  • 网站 黑白竞价推广托管公司介绍
  • 松江做网站的公司wordpress不能自定义
  • 德州网站建设视频不可添加橱窗入口
  • soho建网站 必须先注册公司吗公司的网站建设费入什么科目
  • 如何免费制作一个网站wordpress sql 注入
  • 网站开发 wenzhou建站推荐
  • 建站快车代理平台系统大良网站设计价位
  • 销售推广案例网站岑溪网络推广营销
  • 个人宽带备案网站百货店怎么做网站送货
  • 新开传奇网站发布站文章网站模板哪个好
  • 宁波网站设计公司哪个好河南城乡和住房建设厅网站
  • 重庆网站建设技术外包wordpress修改 版权
  • 去哪个网站做农产品推广网站建设wuhan
  • 企业网站优化的方式商务网站策划书
  • 建设博客网站步骤合肥市建设局
  • 想发布oa网站 需要备案吗wordpress腾讯cos
  • 网站建设实训进程计划中信建设有限责任公司 乔锋 电话
  • 如何做漂亮的网站莆田网站建设制作
  • 做淘宝客网站需要什么要求江西省网站建设
  • 企业网站推广优化公司网络营销的发展趋势
  • 中小型企业网站优化推广建立网站的原因
  • 重庆响应式网站建设哪家有上海品牌logo设计公司
  • 上线了建的网站免费吗站酷网设计素材
  • 中国建设银行网站怎么改支付密码是什么将wordpress 搭建成一个公众网页
  • 帮企业外卖网站做推做利基网站用备案