一个简单的CountDownLauch

2023-11-15

这个类的主要功能就是,当多个线程运行的时候,count满足一定的条件的时候(这里为0),部分线程才开始工作。
具体如下:

#include <atomic>
#include <condition_variable>
#include <mutex>

#ifdef __cplusplus
extern "C" {
#endif

#include <pthread.h>
#include <unistd.h>

#ifdef __cplusplus
}
#endif

class CountDownLauch {
public:
  CountDownLauch(const int n) : count(n) {}
  ~CountDownLauch() = default;

  void countDown() {
    std::unique_lock<std::mutex> lock(m_mutex);
    count--;
    printf("conut -- %d\n", count);

    if (count <= 0)
      m_cv.notify_all();
  }

  void waitCD() {
    std::unique_lock<std::mutex> lock(m_mutex);
    m_cv.wait(lock, [this]() { return this->count <= 0; });
    printf("cv wait return ,count=%d\n", count);
  }

  int getCount() {
    std::unique_lock<std::mutex> lock(m_mutex);
    return count;
  }

private:
  std::mutex m_mutex;
  std::condition_variable m_cv;
  int count{0};
};

void *threadCb1(void *p) {
  CountDownLauch *ptr = reinterpret_cast<CountDownLauch *>(p);

  while (ptr->getCount() > 0) {
    ptr->countDown();
    sleep(1);
    // printf("pthread call\n");
    // printf("pthread exit.\n");
    // pthread_exit(nullptr);
  }
  return nullptr;
}

void *threadCb2(void *p) {
  CountDownLauch *ptr = reinterpret_cast<CountDownLauch *>(p);

  // while (true)
  {
    ptr->waitCD();
    sleep(1);
    // printf("pthread call\n");
    // printf("pthread exit.\n");
    // pthread_exit(nullptr);
  }
  return nullptr;
}

int main() {
  setbuf(stdout, nullptr);
  CountDownLauch c{10};
  pthread_t t = 0;
  pthread_attr_t attr;
  pthread_attr_init(&attr);
  pthread_attr_setdetachstate(&attr, 1);
  pthread_create(&t, &attr, threadCb2, (void *)(&c));

  pthread_t t2 = 0;
  pthread_create(&t2, nullptr, threadCb1, &c);
  pthread_join(t2, nullptr);

  pthread_attr_destroy(&attr);
}

这是对信号变量的非常有用的一个用法,还有一个用法是消费者生产者模式:

class ConPro {
public:
  void produce() {
    std::unique_lock<std::mutex> lock(m_mutex);
    count += 20;
    printf("conut -- %d\n", count);
    m_cv.notify_all();

    while (count > 100) {
      m_cv.wait(lock);
    }
  }

  void consume() {
    std::unique_lock<std::mutex> lock(m_mutex);
    while (count <= 0) {
      m_cv.wait(lock);
    }
    printf("cv wait return ,count=%d\n", count);
    count--;
    m_cv.notify_all();
  }

private:
  std::mutex m_mutex;
  std::condition_variable m_cv;
  int count{0};
};

void test2() {
  ConPro cp;
  auto cb1 = [&cp]() {
    while (true) {
      cp.consume();
    }
  };

  auto cb2 = [&cp]() {
    while (true) {
      cp.produce();
      sleep(1);
    }
  };

  std::thread t1(cb1);
  if (t1.joinable()) {
    t1.detach();
  }
  std::thread t2(cb2);
  if (t2.joinable())
    t2.join();
}

int main() {
    setbuf(stdout, nullptr);
    test2();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个简单的CountDownLauch 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 进程何时获得 SIGABRT(信号 6)?

    C 中进程获得 SIGABRT 的场景有哪些 该信号是否始终来自进程内部 或者该信号可以从一个进程发送到另一个进程吗 有没有办法识别哪个进程正在发送该信号 abort 向调用进程发送SIGABRT信号 就是这样abort 基本上有效 abo
  • 在搜索 List 时,为什么 Enumerable.Any(Func predicate) 比带有 if 语句的 foreach 慢

    最近有件事引起了我的好奇心 Why is the Enumerable Any Func
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 如何将“外部模板”与由同一类中的模板化成员使用的嵌套类一起使用?

    首先 一些背景信息 我尝试以 Herb Sutter 在他的解决方案中介绍的方式使用 Pimpl 习语 得到了 101 http herbsutter com gotw 101 这在头文件中看起来像这样 include pimpl h h
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop

随机推荐

  • Softmax分类器及交叉熵损失(通俗易懂)

    在说分类器前我们先了解一下线性分类 线性函数y kx b 在对于多种类别 多个特征时可将W看做一个矩阵 纵向表示类别 横向表示特征值 现在有3个类别 每个类别只有2个特征 线性分类函数可定义为 我们的目标就是通过训练集数据学习参数W b 一
  • 解决RuntimeError: No such operator image::read_file

    问题在于pytorch版本和torchvision版本不对应 解决方案 卸载版本重新安装对应版本 示例 pip install torchvisioh 0 12 0 对应pytorch 1 12 0版本 不过最后安装貌似1 11 0版本也是
  • Android R开机流程跟踪-----init.rc和启动Zygote

    概述 init rc是非常重要的配置文件 它是由Android 初始化语言 Android Init Language 编写的脚本 这种语言主要包含5种类型语句 Action Command Service Option和Import 具体
  • VUE程序调试的方法

    目录 VUE程序调试的方法 1 写本文的背景 2 调试与测试 3 Console调试法 3 1 添加console log指令 3 2 调出温度界面如下 3 3 Google浏览器的Console窗口 3 4 console error输出
  • Centos7中安装Seafile6.2.5

    在Centos7中安装Seafile6 2 5教程 引言Seafile 是国内团队开发 国际领先的开源企业云存储软件 为企业提供私有云环境下的网盘解决方案 满足文件集中管理 多终端访问 共享协作等需求 功能列表如下 1 1 环境要求 cen
  • 奇异值的物理意义是什么?

    作者 知乎用户链接 https www zhihu com question 22237507 answer 53804902 来源 https www zhihu com question 22237507 answer 60991654
  • python3 sys.argv.py

    模块 01 sys argv py 功能 获取命令行参数 参考 https www runoob com python3 python3 command line arguments html 命令行 python 01 sys argv
  • 利用Fragment编写简易新闻界面,布局同时适应Android手机和平板电脑

    大家好 最近从事培训工作碰到一个练习题 利用Fragment编写简易新闻界面 并且布局能同时适应手机和平板电脑 这是书本上的一个练习题 题目本身没多大难度 个人觉得作者代码的模块化做得比较好 所以拿出来分享 同时自己学习也复习 巩固一下 首
  • 运行vue项目出现错误 SyntaxError:Unexpected identifier

    运行vue项目出现错误 SyntaxError Unexpected identifier 1 运行从svn拉下来的项目 下载完依赖 执行npm install 后 运行出现此错误 2 试了很多方式 重新导入项目 重新下载依赖 查看错误日志
  • Python手册(Python Basics)--Python进阶

    Python 标准库非常庞大 所提供的组件涉及范围十分广泛 正如以下内容目录所显示的 这个库包含了多个内置模块 以 C 编写 Python 程序员必须依靠它们来实现系统级功能 文章目录 字符串 字符串方法 格式化字符串 字符串常量 file
  • C++——并发之std::async使用注意的坑,以及promise,future

    promise背景1 promise背景2 async 1 async 与promise future 1 1 async以及获取时间 async函数如下所示 template
  • matlab-min函数

    matlab对二维矩阵用min函数的用法如下 C min A 如果A是一个向量 min A 返回A中的最小元素 如果A是一个矩阵 min A 将A的每一列作为一个向量 返回一行向量包含了每一列的最小元素 C min A B 返回一个和A和B
  • 不看绝对血亏!java面试项目中的技术难点

    正文 MyBatis 的整体架构分为三层 分别是基础支持层 核心处理层和接口层 如下图所示 基础支持层 反射模块 该模块对 Java 原生的反射进行了良好的封装 提供了更加简洁易用的 API 方便上层使调用 并且对反射操作进行了一系列优化
  • 一边是计算机就业哀鸿遍野,一边是高考生疯狂涌向计算机专业

    在张雪峰推荐的几大专业里 计算机专业是其中之一 近几年 计算机专业报考热度不减 但就业前景却令人堪忧 互联网裁员接二连三 许多码农找不到工作 一位网友感叹 一边是计算机就业哀鸿遍野 一边是高考生疯狂涌向计算机专业 太魔幻了 有人说 大部分家
  • 解决报错:java.net.BindException: 无法指定被请求的地址

    今天在linux虚拟机上装了tomcat 但是一直启动不了 查看日志 主要报错如下 严重 StandardServer await create localhost 8005 java net BindException 无法指定被请求的地
  • VCS IDEA没有Enable Version Control Intergration

    在使用IDEA 提交git push到远程上 找到快忘了的流程 仿照着一步步来 发现都有一个步骤就是指定使用版本管理工具 Enable Version Control Integration 我这找了找发现没有 确实是有这一步指定 版本管理
  • 基于 springboot+vue 进行多条件查询历史聊天记录

    查询历史聊天记录 多条件查询记录是经常需要进行编写的功能 这里就以多条件查询历史聊天记录为例子来介绍如何进行基于关键字 日期 聊天记录类型 三种条件进行模糊查询 日期拼接 条件拼接查询 前端 抽屉管理 首先我们控制 element ui 的
  • spring-boot+maven运行和调试的配置

    spring boot maven 首先说直接运行 WIP Saved Searches migrated to WS 6 0 NJ数据下载工具 基于spring boot的小工具运行方法 在控制台上跳转到项目里initial文件夹所在的目
  • 火币什么时间服务器维护,火币全球站已于今日21:45进行系统维护,时间?

    8月10日消息 Twitter在6月30日发布的NFT系列 The 140 Collection 在OpenSea NFT市场上创造了1700 ETH 530万美元 的总交易量 虽然这个数字远低于Axis Infinity和CryptoPu
  • 一个简单的CountDownLauch

    这个类的主要功能就是 当多个线程运行的时候 count满足一定的条件的时候 这里为0 部分线程才开始工作 具体如下 include