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

福州注册公司流程及费用重庆电子商务seo

福州注册公司流程及费用,重庆电子商务seo,wordpress橫排友情链接,福永做网站的公司1 背景 STL的容器不是线程安全的,我们经常会有需求要求数据结构线程安全,比如写生产者消费者模型的时候,就要求队列线程安全。利用std::queue和C线程标准库的一些组件(mutex,condition_variable)&#xff…

1 背景

  • STL的容器不是线程安全的,我们经常会有需求要求数据结构线程安全,比如写生产者消费者模型的时候,就要求队列线程安全。
  • 利用std::queue和C++线程标准库的一些组件(mutex,condition_variable),可以写一个线程安全的队列ConcurrenceQueue。

2 思路梳理

需要4个函数

  • push,入队;
  • pop,出队并返回原来对头的元素,如果为队空则阻塞
  • tryPop,出队并返回原来对头的元素,如果队空返回空(使用智能指针作返回类型),非阻塞
  • empty,返回是否为空,实则没啥用,多线程条件下判空,下一瞬间另一线程就可能push进去东西了。

3 实现代码

#ifndef __CONCURRENCEQUEUE_H__
#define __CONCURRENCEQUEUE_H__
#include <mutex>
#include <condition_variable>
#include <deque>
#include <queue>
#include <memory>template<typename DATATYPE, typename SEQUENCE = std::deque<DATATYPE>>
class ConcurrenceQueue 
{
public:ConcurrenceQueue() = default;ConcurrenceQueue(const ConcurrenceQueue & other){std::lock_guard<std::mutex> lg(other.m_mutex);m_data = other.m_data;}ConcurrenceQueue(ConcurrenceQueue &&) = delete;ConcurrenceQueue & operator= (const ConcurrenceQueue &) = delete;~ConcurrenceQueue() = default;bool empty() const {std::lock_guard<std::mutex> lg(m_mutex);return m_data.empty();}void push(const DATATYPE & data) {std::lock_guard<std::mutex> lg(m_mutex);m_data.push(data);m_cond.notify_one();}void push(DATATYPE && data) {std::lock_guard<std::mutex> lg(m_mutex);m_data.push(std::move(data));m_cond.notify_one();}std::shared_ptr<DATATYPE> tryPop() {  // 非阻塞std::lock_guard<std::mutex> lg(m_mutex);if (m_data.empty()) return {};auto res = std::make_shared<DATATYPE>(m_data.front());m_data.pop();return res;}std::shared_ptr<DATATYPE> pop() {  // 非阻塞std::unique_lock<std::mutex> lg(m_mutex);m_cond.wait(lg, [this] { return !m_data.empty(); });auto res = std::make_shared<DATATYPE>(std::move(m_data.front()));m_data.pop();return res;}private:std::queue<DATATYPE, SEQUENCE> m_data;mutable std::mutex m_mutex;std::condition_variable m_cond;
};
#endif

 4 测试

全局的:

ConcurrenceQueue<int> g_queue;void producer() 
{    for (int i = 0; i < 100; ++i) {g_queue.push(i);std::this_thread::sleep_for(std::chrono::seconds(3));}
}void consumer1() 
{while (1) {std::printf("[1]  -------   %d\n", *g_queue.pop());}
}void consumer2() 
{while (1) {auto front = g_queue.tryPop();std::printf("[2]  -------   %d\n", front ? *front : -1);std::this_thread::sleep_for(std::chrono::seconds(1));}
}

测试 1:(消费者阻塞式消费)

int main () 
{std::thread t1(producer);std::thread t2(consumer1);t1.join();t2.join();return 0;
}

测试 2:(消费者非阻塞式消费,但要sleep轮询)

int main () 
{std::thread t1(producer);std::thread t2(consumer2);t1.join();t2.join();return 0;
}

http://www.dt0577.cn/news/54913.html

相关文章:

  • 苏州企业网站设计方案站内营销推广途径
  • 网站建设的同义词东莞寮步最新通知
  • 网站建设供应商宁波网络推广
  • 机械加工类网站怎么做东莞网站设计公司
  • 网站做权重有用吗怎么样引流加微信
  • cs5怎么做网站aso优化教程
  • 简单网站制作实例seo诊断的网络问题
  • 先做网站还是先备案营销手机都有什么功能啊
  • 东莞饭堂承包东莞网站建设百度云app下载安装
  • 网站怎样做外链网络公司经营范围
  • 网站建设技术方面论文站长之家关键词挖掘工具
  • 河南智慧团建网站登录池州网站seo
  • 泉州网站建设互联网推广销售
  • 建立旅游网站的目的店铺seo是什么意思
  • 做面包有关电影网站产品营销策划方案
  • 网络构建是什么天津百度seo推广
  • 手游开发公司手游报价网站是否含有seo收录功能
  • wordpress 英文 企业网站模板河南做网站的
  • 买衣服的网站排行榜班级优化大师网页版
  • 江西 网站制作朝阳区seo搜索引擎优化怎么样
  • 男做基视频网站郑州网站排名优化公司
  • 交三百能在网站上找兼职做的举例网络营销的例子
  • 北京建设工程联合验收网站百度检索入口
  • 中国建设银行香港分行网站搜狗引擎
  • 网站开发的流程图和原型图系统优化助手
  • 有了域名之后怎么做网站兰州做网站的公司
  • 天津怎么建立企业网站写一篇推广商品的软文
  • qq网页版 登陆优化方案怎么写
  • wordpress代码逻辑seo查询官方网站
  • 网站开发课程设计总结网球新闻最新消息