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)
上一篇 2022年7月19日 上午10:36
下一篇 2022年7月19日 上午10:36


相关推荐

  • Oracle Client(客户端) 安装与配置「建议收藏」

    Oracle Client(客户端) 安装与配置「建议收藏」因为工作需要,需要通过本地oracle客户端将数据导入到远程服务器上的oracle数据库中。从csdn下了很多oracle客户端,都是属于精简版,缺少imp.exe文件,造成无法导入数据。所以最终从o

    2022年7月1日
    48
  • 关闭端口命令[通俗易懂]

    关闭端口命令[通俗易懂]

    2022年7月20日
    15
  • JavaScript正则表达式简单教程「建议收藏」

    JavaScript正则表达式简单教程「建议收藏」1.常见的正则表达式符号?.匹配除换行符以外的任意字符\w匹配字母或数字或下划线或汉字\s匹配任意的空白符\d匹配数字\b匹配单词的开始和结束^匹配字符串的开始$匹配字符串的结束*重复零次或更多次+重复一次或更多次?重复零次或一次{n}重复n次{n,}重复n多次{n,m}重复n到m词\W匹配任意不是字母,数字,下划线,汉字的字符\S匹配任意不是空白符的字符\D匹配任意非数字的字符\B匹配不是单词开头或结尾的位置【^x】匹配除了x

    2025年11月30日
    6
  • OpenClaw 新手引导(macOS 应用)

    OpenClaw 新手引导(macOS 应用)

    2026年3月14日
    1
  • 自然常数e与重要极限

    自然常数e与重要极限无理数 eee 又称自然常数 是一个人为定义的数 约等于 2 71828 我们在很多地方都能看到它的身影 如欧拉方程 自然对数中等等 定义 eee 的定义式为 lim x 1 1x x e lim x to infty 1 frac 1 x x ex lim 1 x1 x e 该式是两个重要极限中的其中一个 要理解该定义式的由来 就不得不先介绍一下指数增长模型指数增长

    2026年3月17日
    1
  • Android实战技巧之六:PreferenceActivity使用详解

    Android实战技巧之六:PreferenceActivity使用详解一 写作前面当我们做应用的时候 需要用户配置一些信息 而这就是通常所说的应用设置 对于 Android 系统来说 系统本身的设置带来的用户体验和习惯已经深入人心 在我们的应用中同样用到类似的设置页 那么用户使用起来就会更加亲切和方便 是吗 那我们应该怎么做到呢 这就要靠本文的主人公 PreferenceAc 了 二 设置的细节打开 Android 手机的设置 我们会看到整个

    2026年3月26日
    2

发表回复

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

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