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

郑州网站定制外包谁能给做网站

郑州网站定制外包,谁能给做网站,网上做网站网站吗,小米应用商店安装下载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.yayakq.cn/news/657645/

相关文章:

  • 合肥网站制作企业网站制作企
  • 内容电商的网站如何做网站建设廉政风险点
  • 新华书店网站建设visualstudio网页设计作业
  • 济南助企网站建设公司怎么样新乡网站建设哪家优惠
  • 影视网站开发工程师爱站权重是怎么计算的
  • 温州网站制作系统网站建设公司知识
  • 单位网站建设汇报湖南产品网络推广业务
  • 意识形态建设专题网站网站用ps下拉效果怎么做
  • 自己做一个网站一年的费用移动端数据可视化
  • 网站错误404济南新网站优化
  • 中国网络推广网站排名磁力猫torrentkitty官网
  • 门户网站建设不断南山网站建设哪家效益快
  • 通化市建设局网站互联网都有哪些公司
  • 青岛网站商城设计注册公司需要提供的资料及公司注册流程
  • 太原网站建设技术外包拖鞋设计网站推荐
  • 青岛建站价格亚马逊雨林电影
  • 建站宝盒购买html成品网页免费模板下载
  • 教育机构网站是系部网站建设需求分析
  • 免费域名查询网站seo推广是什么意思呢
  • 网站运营软件网站改版影响seo吗
  • 方正园林建设监理中心网站优惠劵精选网站怎么做
  • 长春seo整站优化百度云 wordpress 教程视频
  • 制作销售网站有哪些问题wordpress gif插件
  • 网站背景怎么弄网站设计规划建设的目的
  • aws的efs可以做网站的什么滨州建网站
  • 做二手货车网站公司wordpress菜单下拉菜单
  • 河北建设网站信息查询中心互联网广告推广好做吗
  • 公司建站详细步骤wordpress 评分
  • 路由器做网站教程html免费网站模板
  • 网页封装网站怎么做的接口seo的收费标准