lock free 之 stack

lock free 之 stack第二个例子(和第一个一样,没加注释,均是消费者需要判断生产者还在生产吗),在实际中,可以考虑使用这个模型,比起我前面写的数据队列来说,用boost::lockfree可以大大减轻工作,这也是今年要努力掌握boost的一个理由#include#include#include#includeboost::atomic_intproducer_count(0);boost::a

大家好,又见面了,我是你们的朋友全栈君。第二个例子(和第一个一样,没加注释,均是消费者需要判断生产者还在生产 吗),在实际中,可以考虑使用这个模型,比起我前面写的数据队列来说,用boost::lockfree可以大大减轻工作,这也是今年要努力掌握boost的一个理由
大笑

#include <boost/thread/thread.hpp>
#include <boost/lockfree/stack.hpp>
#include <iostream>

#include <boost/atomic.hpp>

boost::atomic_int producer_count(0);
boost::atomic_int consumer_count(0);

boost::lockfree::stack<int> stack(128);

const int iterations = 1000000;
const int producer_thread_count = 4;
const int consumer_thread_count = 4;

void producer(void)
{
    for (int i = 0; i != iterations; ++i) {
        int value = ++producer_count;
        while (!stack.push(value))
            ;
    }
}

boost::atomic<bool> done (false);

void consumer(void)
{
    int value;
    while (!done) {
        while (stack.pop(value))
            ++consumer_count;
    }

    while (stack.pop(value))
        ++consumer_count;
}

int main(int argc, char* argv[])
{
    using namespace std;
    cout << "boost::lockfree::stack is ";
    if (!stack.is_lock_free())
        cout << "not ";
    cout << "lockfree" << endl;

    boost::thread_group producer_threads, consumer_threads;

    for (int i = 0; i != producer_thread_count; ++i)
        producer_threads.create_thread(producer);

    for (int i = 0; i != consumer_thread_count; ++i)
        consumer_threads.create_thread(consumer);

    producer_threads.join_all();
    done = true;

    consumer_threads.join_all();

    cout << "produced " << producer_count << " objects." << endl;
    cout << "consumed " << consumer_count << " objects." << endl;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161723.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 树莓派4b OpenWrt做旁路由

    树莓派4b OpenWrt做旁路由主要分为以下几步:一、下载并刷入OpenWrt固件OpenWrt固件用的是Lean大的最新编译好的固件,按照正常的步骤在GitHub上下载并将二、进入路由器后台修改静态IP及相应的防火墙设置三、连接树莓派的wifi,并手动设置IP…

    2022年5月12日
    54
  • 提交到svn服务器时,一直缓冲不,

    提交到svn服务器时,一直缓冲不,

    2021年9月20日
    49
  • 如何在win10上安装ubuntu虚拟机-图文详细教程「建议收藏」

    前言(和我一样的小白快来看看~)本文将在win10上安装ubuntu虚拟机的步骤一步步记录了下来~希望对大家有帮助方法大概是先装一个虚拟化软件(virtualbox),然后在这个软件上新增一台虚拟电脑机,这样我们就等于有了一台没有装系统的电脑。然后再将我们已经下载好的iso结尾的镜像文件(ubuntu)作为启动盘,给这个虚拟电脑装上系统,就完事了~安装包和镜像文件准备virtu…

    2022年4月6日
    46
  • Maven菜鸟教程:Maven仓库的分类[通俗易懂]

    Maven菜鸟教程:Maven仓库的分类[通俗易懂]Maven菜鸟教程中有很多知识点需要大家学习,Maven仓库分类就是其中一点,为了更具体地增加对仓库的理解,这里详细介绍一下各种仓库。本地仓库Maven在根据坐标查找依赖的构件时,先是在本地仓库中查找。默认情况下,不管是Windows操作系统还是Linux操作系统,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的目录,这个目录就是Maven的本地仓库目录。比如,笔者的用户名是Noble,计算机上的默认本地仓库的目录就是C:\Users\Noble.m2

    2025年10月8日
    2
  • kotlin 跳出循环[通俗易懂]

    kotlin 跳出循环[通俗易懂]kotlin跳出循环有一个标记,满足条件就跳到标记处。

    2022年6月3日
    35
  • bash组织成树数据结构

    bash组织成树数据结构

    2022年1月14日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号