Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >在硬件应用程序中使用共享内存(C++)时需要互斥

在硬件应用程序中使用共享内存(C++)时需要互斥
EN

Stack Overflow用户
提问于 2016-03-24 07:51:38
回答 3查看 154关注 0票数 0

我有一个传感器,它以n Hz的速度向线程中的共享内存写入数据(比如每秒10Hz=10次)。一个单独的线程正在读取这些数据,并使用它来获取一些结果。读取器线程的频率不同。它可以更慢,例如每秒8次,也可以更快,例如每秒15次,这取决于正在计算的内容。读取器线程只是从共享内存中读取数据。它不修改数据(只对其进行处理以获得某些结果),也不向共享内存写入任何内容。整个过程运行得非常整洁。我不关心同步,因为读取器只是在需要的时候读取共享内存中的内容(它轮询数据)。如果在两次读取之间,共享内存的内容发生更改,则读取器将使用新数据。如果在两次读取之间,共享内存的内容没有改变(如果读取器比写入器快得多),那么读取器只使用共享内存中的任何数据。

现在,我的同事告诉我使用互斥来同步对共享内存的访问,但我不同意。原因是,如果我使用互斥锁来控制访问,写入器写入共享内存的频率将会有所降低(当读线程锁定互斥锁并写入时)。在未来,我们将有更多的读线程,我担心写线程写入共享内存的频率将进一步降低,因为将有更多的线程竞争互斥锁。

我知道竞态条件等,但我感觉竞态条件以及上面给出的大量例子以及其他网站考虑的场景与我的不同:例如,当两个线程正在读取和处理银行余额,其中一个线程读取速度较慢或较快,余额以$2000而不是$1000的erroneous...resulting结束。然而,在我的例子中,“银行余额”-要共享的数据是由传感器生成的。值的任何变化都是由物理原因造成的,要共享的数据值永远不会跳跃这么大的量。

更多细节:该传感器是一个距离测量传感器。它可以在一秒内测量10次距离。假设t=1.0s处的距离为10 to,并将其写入内存。读取器读取显示为10 The的共享内存。现在,如果实际距离在阅读器读取或处理数据时碰巧发生变化,它将是10.1厘米,或者因为距离永远不会有很大的跳跃。在下一次轮询中,读者将读取10.1厘米的距离(假设物体是静止的)。通过这种方式,我的写入器线程可以在不等待互斥锁被解锁的情况下尽可能快地写入。

我的推理有缺陷吗?我能想到的唯一问题是,如果我的写线程和读线程试图完全同时访问内存。但是,调度器应该在指令之间切换,对吧?也就是说,它只是伪并行处理,对吗?这意味着它们不能同时访问内存,对吗?

EN

回答 3

Stack Overflow用户

发布于 2016-03-24 08:02:44

我不知道这个答案是否应该是一个评论,如果是,请让我知道……

您可以尝试实现循环缓冲区。这样,写入器就有了一个指针,它只是在缓冲区中旋转并继续写入。读者也有同样的想法,只是要“落后于”作者。

这意味着当写入器写入一些值时,它必须增加变量,该变量说明有多少数据可用。当读取器读取样本时,它必须减少这个变量。这些操作必须锁定在互斥锁中。虽然i++和i--是原子操作,但在多核系统上,这仍然会带来麻烦,我很难发现这一点。

所以,是的,你确实需要互斥锁,但因为只需要一个变量,所以它不会让你的整个程序变慢太多……

票数 3
EN

Stack Overflow用户

发布于 2016-03-24 08:04:03

这取决于您的实现是否使用抢占任务(例如中断)。可能是读线程正在读取值,并且在读过程中被写线程中断。在你的例子中,我假设这个值只是一个整数,因此它不是那么关键。只需确保在读取线程中每次执行时只读取一次数据(请参阅原子操作)。如果该值大于一个寄存器值。您可以通过使用队列和多级缓冲区来避免互斥。但是这会增加你的内存使用量。在你的例子中:如果你的数据大于一个整数,我建议使用三重缓冲内存。在这种情况下,您拥有三个缓冲区,值被写入第一个缓冲区,在完成后,缓冲区与第二个缓冲区交换,而您的读取线程可以读取第三个缓冲区。

票数 1
EN

Stack Overflow用户

发布于 2016-03-24 08:29:37

在你的例子中,问题是读取器可以在写变量的同时读取,问题只是写,所以我建议你使用原子操作来写,这样你就不需要互斥锁了。如果数据是对齐的(参见Read and Write atomic operation implementation in the Linux Kernel),那么读操作是原子的,我不确定写操作,但可能不是,所以让我们来看看我们能做什么:

在C++中,STL提供了一些材料来保证操作是原子的请参阅:http://en.cppreference.com/w/c/atomic在C中,我发现在标准http://www.gnu.org/software/libc/manual/html_node/Atomic-Types.html中定义的sig_atomic_t类型保证了读取和写入的原子操作,它应该在没有互斥锁的情况下完成这项工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36195399

复制
相关文章
java 对于表情和特殊字符的转码解码处理
转码然后插入到DB当中 String encodestr=URLEncoder.encode("需要转码的内容", "utf-8") 将encodestr插入数据库中 解码然后显示到页面当中 String decodestr=URLDecoder.decode("需要解码的内容", "utf-8") 在页面展示decodestr
用户4191150
2021/08/12
3.8K1
MSBuild 中的特殊字符($ @ % 等):含义、用法以及转义
在 MSBuild 中有一些特殊字符,如 $ @ % ' 等,本文介绍他们的含义,如何使用他们,以及你真的需要这些字符的时候如何编写他们。
walterlv
2023/10/22
4280
Shell特殊字符
shell既是类Unix操作系统的命令解析器,用于解释执行用户输入的一连串命令,它类似于DOS下的command和后来Windows的cmd.exe。同时shell也是一种程序设计语言。作为命令解释型的脚本语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它预定义了各种环境变量,保留了一些关键字以及一些特殊字符的含义,并提供了许多在高级语言中才具有的控制结构,包括循环和分支判断。
恋喵大鲤鱼
2018/08/03
5.2K0
HTML特殊字符
HTML 原始码 显示结果 描述 &lt; < 小於号或显示标记 &gt; > 大於号或显示标记 &amp; & 可用於显示其它特殊字符 &quot; " 引号 &reg; ® 己注册 &copy; © 版权 &trade; ™ 商标 &ensp; 半方大的空白 &emsp; 全方大的空白 &nbsp; 不断行的空白
小小许
2018/09/20
3.7K0
MySQL 特殊字符
SQL 注释是用来在 SQL 语句中添加对代码的解释说明。SQL 支持两种类型的注释符号。
恋喵大鲤鱼
2023/10/12
9820
特殊的 x 命名空间
为什么叫它特殊呢,因为x命名空间中的东西是用来服务整个xaml页面的,通过这个命名空间中的工具,可以去扩充xaml的功能,或者帮助我们更好的开发xaml页面。
宿春磊Charles
2021/11/05
5970
Jdom生成xml文件时的特殊字符问题(冒号,注释等)
public static String toXML(String path) throws IOException { Element root = new Element("ADI"); // 将根节点添加到文档中; Document Doc = new Document(root); CDATA text = null; // 创建节点 Element elements = new Elem
JQ实验室
2022/02/10
7670
Python一行代码过滤标点符号等特殊字符
很多时候我们需要过滤掉标点符号等特殊字符,网上虽然有一堆的方法,但是都没有找到一个非常满意的,有些过滤不了中文的标点符号,有些过滤不了英文的标点符号,有些过滤不全。
AntDream
2019/08/13
4.1K0
特殊字符乱码问题
1、使用标签 建议用(标签可以控制转换特殊字符): <html:text property=“instruction” readonly=“true” styleClass=“mylongreadonly” size=“32”/> <input name=“instruction” type=“hidden” value=”<mycim2:write name=“object” property=“instruction” filter=“true”/>” > <input name=“instruction” type=“hidden” value=”<bean:write name=“object” property=“instruction” filter=“true”/>” >
全栈程序员站长
2022/06/27
2.7K0
iOS去除特殊字符
// 清除特殊字符 + (NSString *)cleanSpecialCharacters:(NSString *)text { NSString *strResult = nil; NSMutableString *originString = [text mutableCopy]; NSCharacterSet *cs = [NSCharacterSet characterSetWithCharactersInString:@"~!@#$%^&*()+={}':;',[]\\.
Raindew
2019/05/17
3.3K0
转义JavaScript特殊字符
大家可以举一反三,触类旁通,反正,双引号和单引号可以配合着使用,把我上面的案例看懂,你就能灵活的运用了。
IT工作者
2022/01/05
4.1K0
字符串解码
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你的益达
2020/08/05
5980
空间索引-geohash编码解码类
算法实现原理请看:http://www.php20.cn/article/125
仙士可
2019/12/19
1K0
空间索引-geohash编码解码类
Shell常用的特殊字符
点号在不同场景有着不同的含义,在目录路径中,一个点代表当前工作目录,两个点代表父目录;当一个文件以点号开头,表示一个隐藏文件;在正则表达式,点号代表匹配单个字符;
用户1679793
2020/10/29
8.1K0
BashShell常量和特殊字符
其中,base 是一个 2 到 64 的十进制数值,表示数字的基数;n 是在 base 基数中的数字的值。如果忽略 base# ,则默认以 10 为基数。n 中的每一位数如果大于 9,则依次以小写字母、大写字母、@、_ 表示(最大表示到十进制中的 63,因为 base 最大为 64)。
hotarugali
2022/02/28
5.6K0
jquery特殊字符问题处理
问题:今天项目上有个地方使用 $(“#lamp”).load(‘/admin/checklogin.php?sid=’+sid); 这样传递的时候遇到空格就直接参数就丢失 后经查询资料发现可以使
苦咖啡
2018/05/07
2.9K0
Java 字符编码与解码
IT可乐
2018/01/04
2.3K0
LogQL如何转义特殊字符
在上篇的Loki操作方法系列中,我已经分享了创建快速过滤器查询的所有最佳技巧,这些查询可以在几秒钟内过滤掉TB级的数据。
云原生小白
2021/05/13
2.9K0
点击加载更多

相似问题

解码特殊字符

25

解码特殊字符“?”

11

通用URL解码函数应该处理"+“字符还是只处理"%20”等字符?

12

HTML特殊字符解码

20

邮编-解码特殊字符

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文