在C++中使用线程交替打印奇数和偶数

2023-12-09

使用线程打印奇偶数我遇到了这个问题并想讨论 C++ 中的解决方案。我能想到使用2个二进制信号量奇数和偶数信号量。偶数信号量初始化为 1,奇数信号量初始化为 0。

**T1 thread function** 
funOdd()
{  
  wait(even)  
  print odd;  
  signal(odd)  
}


**T2 thread function**
funEven()  
{  
  wait(odd)  
  print even  
  signal(even)  
}  

除此之外,如果我的函数仅生成数字并且有第三个线程 T3 将打印这些数字,那么理想的设计应该是什么?我使用了一个数组,其中奇数将放置在奇数位置,偶数将放置在偶数位置。 T3 将从该数组中读取,这将避免该数组上的任何线程安全,并且如果 T3 找不到任何索引,那么它将等待直到该索引被填充。另一种解决方案是使用一个具有互斥体的队列,该互斥体可以在插入时由 T1 和 T2 使用。

请评论这个解决方案以及我如何才能使其更有效。

编辑以使问题更加清楚:总体问题是我有两个生产者(T1,T2)和一个消费者(T3),并且我的生产者是相互依赖的。


使用条件变量

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mu;
std::condition_variable cond;
int count = 1;

void PrintOdd()
{
    for(; count < 100;)
    {
        std::unique_lock<std::mutex> locker(mu);
        cond.wait(locker,[](){ return (count%2 == 1); });
        std::cout << "From Odd:    " << count << std::endl;
        count++;
        locker.unlock();
        cond.notify_all();
    }

}

void PrintEven()
{
    for(; count < 100;)
    {
        std::unique_lock<std::mutex> locker(mu);
        cond.wait(locker,[](){ return (count%2 == 0); });
        std::cout << "From Even: " << count << std::endl;
        count++;
        locker.unlock();
        cond.notify_all();
    }
}

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

在C++中使用线程交替打印奇数和偶数 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 通过Ajax回调在产品页面显示woocommerce通知

    我正在尝试在产品页面中显示 woocommerce 通知 该通知应通过 ajax 回调函数显示 并由按钮触发 回调工作正常 但没有显示任何通知 这是我的代码 jQuery AJAX document ready function retur
  • mkfifo 导致终端挂起?

    Does mkfifo根本无法与 Cygwin 一起使用 一组简单的命令 例如 mkfifo my pipe echo 1234 gt my pipe 只会导致终端永远停留在光标闪烁的状态 我 做错事 了吗 不 你没有做错任何事either
  • 如何隐藏 PrimeFaces 资源的“ln”和“v”实现/版本相关参数

    我在我的应用程序中使用 primefaces 和 primefaces extensions 对于 css 和 js 文件等每个资源 该资源的 GET 请求中还有一个 ln 和 v 查询参数 如下所示 primefaces extensio
  • 使用 xp_cmdshell 通过 DTEXEC 传递变量 (SQL Server 2008)

    我创建了一个 SSIS 包 将 Excel 文件导入到我的数据库中 我创建了一个变量 我想将其用作 Excel 连接管理器的 Excel 文件路径 我的 SSIS 包中的变量名称是 ExcelSource 它应该代表完整路径 我想最终动态设
  • Flutter:如何在Swiper中完成特定逻辑后显示下一个索引,其中GridView也在Swiper中设置?

    我正在尝试制作一个文字游戏 首先 索引将是白色的 如果用户单击正确的答案 则索引将变为绿色并进入下一个屏幕 并且下一个屏幕中的索引将为白色 再次 如果用户单击不正确的答案 则索引将变为红色 并且不要放开下一页直到用户输入正确答案 我在 Sw
  • 使用 SpongyCastle 的 PKCS#10 客户端证书创建 Https 连接

    The goal 我正在努力实现与客户端证书的通信 步骤 1 创建 PKCS 10 请求 CSR 并将其交给我的服务器进行签名 服务器联系人将 CSR 传递给 CA CA 对其进行签名 并返回 PKCS 7 带有签名的 PKCS 10 和
  • 如何在 Netbeans 中添加 Scala 平台?

    我已经为netbeans安装了一套Scala插件 具体来说 Scala 控制台 项目 运行时库 平台 平台标准 编辑器 调试器项目集成 重构 调试器 核心 和 Rats Packrat 解析器 我还通过 ubuntu aptitude 包管
  • 防止多列布局中的元素碎片

    鉴于此代码 wrapper border 2px solid red padding 10px width 310px height 310px webkit column width 150px webkit column gap 10p
  • PHP 写入文件

    下面是我用来将地图数组 翻译 为 SQL 代码的一些代码 以便在更新游戏地图时可以轻松更新数据库 正如您所看到的 它将 SQL 代码打印到屏幕上 以便我可以复制并粘贴它 随着我的地图变得更大 这将变得效率低下 因为它会因大量输出而使浏览器崩
  • Antlr4:输入不匹配

    这是一个简单的语法测试 我认为很容易解析 但我立即得到 不匹配的输入 并且我无法弄清楚 Antlr 正在寻找什么 输入 include something program TEST1 BLAH BLAH 我的语法 grammar ProgH
  • 从字符串转换日期和/或时间时转换失败

    我有这个查询 set IDENTITY INSERT dbo OtherData1 ON INSERT INTO OtherData1 OtherDataID EmployeeID OtherDate OType OSubject Stat
  • Sphinx 内联包括

    我想使用 include 函数内联 但只有当我用两行新行与前面的文本分开时 我才能让它实际包含我想要的文件 在有人问之前 我想包含的文件是一个协议号 所以不 它根本不会从新行中受益 我希望能够轻松更改它 以便我可以在文档的多个位置使用它 我
  • Perl 中的 yyyymmddhhmmss 到 YYYY-MM-DD hh:mm:ss?

    在 perl 中将 yyyymmddhhmmss 转换为 YYYY MM DD hh mm ss 并返回的最佳方法是什么 例如 20130218165601 到 2013 02 18 16 56 01 并返回 能https metacpan
  • 颜色树状图根据外部标签向根向上分支,直到标签匹配

    来自问题使用现有列的树状图的颜色分支 我可以为树状图叶子附近的分支着色 代码 x lt 1 100 dim x lt c 10 10 set seed 1 groups lt c red red red red blue blue blue
  • 如何填补自增字段的“洞”?

    我读过一些关于此的文章 但没有一篇涉及这个问题 我想这是不可能的 但我还是会问 我有一个包含 50 000 多个寄存器的表 这是一个旧表 其中发生了各种插入 删除操作 也就是说 大约 300 个寄存器中存在各种 漏洞 即 1340 1341
  • 打包java应用程序

    我有一个 java 应用程序 从中构建了一个依赖于许多第三方 jar 的 jar 打包该应用程序以供最终用户分发的最佳 常见方法是什么 最好的方法是使用像这样的构建工具Maven2或类似的东西 并使用它来管理您的依赖项并构建一个一体化的包
  • R 中 2 个 DTM 的余弦相似度

    我有 2 个文档术语矩阵 DTM 1 有 1000 个向量 1000 个文档 并且 DTM2 有 20 个向量 20 个文档 所以基本上我想将 DTM1 的每个文档与 DTM2 进行比较 并希望使用余弦函数查看哪些 DTM1 文档与哪些 D
  • C# - 不时检查文件是否存在并从中读取

    我创建一个 Windows 服务 它会不时检查某个文件是否存在 如果存在 然后从中读取数据 将数据发送到服务器并将文件移动到另一个文件夹 文件大小约为 1 3 Mb 我想我会用System Threading Timer此处检查文件是否存在
  • 字符串中第一个数字用“*”分隔字符串

    我认为这是一个简单的问题 但我看不出我错过了什么 我想在第一个数字处分割字符串 在字符串中存在非字母数字符号之前效果很好 帮助 Works pet lt c Dog 100 Cat 340 df lt as data frame pet d
  • 在C++中使用线程交替打印奇数和偶数

    使用线程打印奇偶数我遇到了这个问题并想讨论 C 中的解决方案 我能想到使用2个二进制信号量奇数和偶数信号量 偶数信号量初始化为 1 奇数信号量初始化为 0 T1 thread function funOdd wait even print