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

成都网站建设cdajcxmip网站案例

成都网站建设cdajcx,mip网站案例,代理注册,怎样在网站做转向连接【条件变量导读】条件变量是多线程中比较灵活而且容易出错的线程同步手段#xff0c;比如#xff1a;虚假唤醒、为啥条件变量要和互斥锁结合使用#xff1f;windows和linux双平台下#xff0c;初始化、等待条件变量的api一样吗#xff1f; 本文将分别为您介绍条件变量在w…【条件变量导读】条件变量是多线程中比较灵活而且容易出错的线程同步手段比如虚假唤醒、为啥条件变量要和互斥锁结合使用windows和linux双平台下初始化、等待条件变量的api一样吗 本文将分别为您介绍条件变量在windows和linux平台下的用法和注意事项好直接进入主题。 条件变量的使用场景可以用如下流程图进行阐述。 我们需反复判断一个多线程共享条件是否满足一直到该条件满足为止由于该条件被多个线程操作。因此每次判断前进行加锁操作判断完毕后解锁。但上述逻辑存在严重的效率问题假设我们解锁离开临界区后其他线程修改了条件导致条件满足了此时程序仍然需要睡眠 n 秒后才能得到反馈。因此我们需要这样一种机制 某个线程 A 在条件不满足的情况下主动让出互斥锁让其他线程去争夺这把锁当前线程A在此处等待等待条件的满足一旦条件满足其他线程释放锁并通知条件满足线程A就可以被立刻唤醒并能获取到互斥锁对象。1、Windows下条件变量的用法 具体条件变量的定义和api我就不介绍了大家参考如下示例程序就能很轻松地掌握条件变量地初始化本文地重点是介绍条件变量地用法及注意事项。 #include iostream #include thread #include condition_variable #include mutex #include listclass ThreadTask {public:ThreadTask(int taskId){m_taskId taskId;}void doTask(){std::cout threadId: std::this_thread::get_id() do Task, taskId: m_taskId std::endl;}private:int m_taskId; };/定义全局互斥锁对象 std::mutex myMutex; //定义全局的windows条件变量 std::condition_variable myCv; /全局任务队列 std::listThreadTask* taskList;void* consumeThread() {while (true){/判全局条件公共队列taskList是否为空前先加锁std::unique_lockstd::mutex lk(myMutex);while (taskList.empty()){ /*如果条件不满足那继续等待条件变量满足条件同时立刻让出刚占有的互斥锁对象让其他线程去争抢*/myCv.wait(lk); } //假设条件满足了当前线程将从myCv.wait(lk)返回//并立刻获取互斥锁对象操作公共的全局队列ThreadTask* pTask taskList.front();//头部弹任务taskList.pop_front();if (!pTask)continue;pTask-doTask();delete pTask;pTask nullptr;}return nullptr; }void* produceThread() {int taskId 0;while (true){ThreadTask* pTask nullptr;{std::lock_guardstd::mutex lk(myMutex);taskId;pTask new ThreadTask(taskId);taskList.push_back(pTask);std::cout thread: std::this_thread::get_id() produce a Task, taskId: taskId std::endl;}/*生产完任务通知消费线程consumeThread条件满足释放锁资源myMutex*/myCv.notify_one();std::this_thread::sleep_for(std::chrono::seconds(1));}return nullptr; }int main() {std::thread consumeThread1(consumeThread);std::thread consumeThread2(consumeThread);std::thread consumeThread3(consumeThread);std::thread produceThread(produceThread);if (produceThread.joinable())produceThread.join();if (consumeThread1.joinable())consumeThread1.join();if (consumeThread2.joinable())consumeThread2.join();if (consumeThread3.joinable())consumeThread3.join();return 0; }程序运行的结果 可以看出生产线程生产完任务塞到公共队列中去通知消费线程去公共队列中取任务一共四个线程在操作公共队列taskList并没有出现资源冲突的情况。这便是条件变量使用的妙处 从上述代码中可以看到条件变量竟然在等待一把互斥锁。 std::unique_lockstd::mutex lk(myMutex); while (taskList.empty())myCv.wait(lk);为啥条件变量要和互斥锁配合一起使用我们可以假设下面这段伪码互斥锁和条件变量分开使用。 lock(myMutex) while (taskList.empty()) {//释放锁unlock(myMutex);/再等待条件cvcond_wait(cv);//再加锁lock(myMutex) }假设线程当前线程线程A执行到第5行代码释放了锁此时操作系统把CPU时间片分配给另外一个等待myMutex的线程B随后线程B释放信号表明条件cv已经满足等到线程A争抢到CPU时间片之后就已经错过了线程B释放的信号了那么线程B将永远阻塞在cond_wait()接口上。 解锁和等待条件变量必须是原子性的操作要么都成功要么都不成功否则就很难保证线程的同步。 还有虚假唤醒的问题何为虚假唤醒就是 myCv.wait(lk)接口突然返回了但它并不是被其它线程的信号唤醒的可能是被操作系统某个中断信号给唤醒的此时并没有相应的任务需要处理如果继续让线程走下去就可能会有问题所以为了防止这种虚假唤醒的现象我们外部循环去判断公共队列是否为空如果为空那就继续等待。这是Linux服务端面试必问的考点请同学们慎重。 好介绍完条件变量在windows下的用法那么接着看下条件变量在linux下的用法。 2、Linux下条件变量的用法 条件变量的用法流程和windows的差不多主要差异就是创建线程、初始化条件变量、等待条件变量的api接口不一样。 那直接上代码 #include iostream #include pthread.h #include error.h #include list #include unistd.h #include semaphore.h using namespace std;class ThreadTask {public:ThreadTask(int taskId){m_taskId taskId;}void doTask(){cout doTask taskId : m_taskId thread Id: pthread_self() endl;}private:int m_taskId; };pthread_mutex_t myMutex; pthread_cond_t myCond; listThreadTask* taskList; void* consumeThread(void* param) {while(true){pthread_mutex_lock(myMutex);while(taskList.empty()){pthread_cond_wait(myCond, myMutex); }ThreadTask* pTask taskList.front();taskList.pop_front();pthread_mutex_unlock(myMutex);if (pTask nullptr)continue;pTask-doTask();delete pTask;pTask nullptr;}return NULL; } void* produceThread(void* param) {int taskID 0;ThreadTask* pTask NULL;while (true){pTask new ThreadTask(taskID);pthread_mutex_lock(myMutex);taskList.push_back(pTask);std::cout produce a task, taskID: taskID , threadID: pthread_self() std::endl; pthread_mutex_unlock(myMutex);//释放信号量通知消费者线程pthread_cond_signal(myCond);taskID;sleep(1);}return NULL; }int main() {pthread_mutex_init(myMutex, NULL);pthread_cond_init(myCond, NULL);//创建3个消费者线程pthread_t consumerThreadID[5];for (int i 0; i 3; i){pthread_create(consumerThreadID[i], NULL, consumeThread, NULL);}//创建一个生产者线程pthread_t producerThreadID;pthread_create(producerThreadID, NULL, produceThread, NULL);pthread_join(producerThreadID, NULL);for (int i 0; i 3; i){pthread_join(consumerThreadID[i], NULL);}pthread_cond_destroy(myCond);pthread_mutex_destroy(myMutex); return 0; }Linux平台下运行的结果
http://www.hkea.cn/news/14581631/

相关文章:

  • wordpress网站如何提速量品定制和衣邦人哪个好
  • 潍坊网站建设优化排名建站市场分析
  • 企业网站建设外包临城网站
  • wordpress多语言配置文件网站免费优化工具
  • 做视频包的网站有哪些专门做ui图标的网站
  • 个人小型网站建设app开发公司资质
  • 卫生局网站建设阜宁住房和城乡建设局网站
  • 鹤山市住房和城乡建设局网站广东住房和城乡建设厅网站造价
  • 网站 建设文档企业网站有什么功能
  • 做网站是专业店面装修设计公司
  • 永康建设局网站微信扫码登记小程序
  • 为客户网站做产品描述建设个人网站第一步这么做
  • 企业网站策划怎么样建立网站有什么好处
  • 网站建设系统规划批量做网站
  • 彩钢做网站能赚钱吗公司网站建设是哪个部门的事情?
  • 沈阳高端网站制作公司上海鹭城建设集团网站
  • 广州机械网站开发商标交易
  • 个人网站建设模板简洁图片淘宝网页制作素材
  • 小米路由可以做网站吗免费外网加速器
  • 做视频网站都需要什么软件下载眉山网站开发
  • 网站申请了如何上传到服务器公司邮箱名称怎么取比较好
  • 网页模板素材网站网站建设与实现 文献综述
  • 女性时尚网站源码建设一个网站需要多久
  • php网站源码大全网页空间是什么意思
  • 可以做国外购物的网站有哪些西安有什么好玩的景点
  • 做网站手机端需要pc端的源代码吗ai免费模板网站
  • ai做的比较好的网站网站模板平台
  • 广元做网站站排名六盘水网站开发
  • 个人网站有什么外国广告做wordpress自动tag内链
  • 正规网站制作公司哪家好徐州seo建站