完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我读到 SMP 特性:
对称内存(有一些小例外)。 如果多个内核访问相同的内存地址,它们的访问将在内存总线级别序列化。 通过原子比较实现对相同内存地址的真正原子访问-ISA 提供的交换指令。 那么这是否意味着我可以创建全局变量而不用担心多线程访问? |
|
相关推荐
3个回答
|
|
假设变量是 8 位、16 位或 32 位,并且只能这样访问(如果不是,答案总是“否”):取决于您对“访问”的定义。如果您有一个线程写入它而另一个线程读取它,则没有问题。但是,如果您有一个需要多次访问的操作,您仍然需要线程安全。例如,如果变量用作信号量:线程 1 将变量设置为 1,线程 2 读取变量,如果为 1,则将其清除为 0 并执行某些操作。在那种情况下,读取和写入是两个不同的操作,线程 1 可能会“潜入”另一个“设置为 1”,这会丢失。
|
|
|
|
如果您不使用原子指令来读/写它,您可能想要记录该变量中永远喜欢的废话。很容易忘记这件事之所以有效,是因为该体系结构恰好自行原子地执行 32 位读/写,将其更改为例如 64 位变量或结构,并在您的程序中引入非常微妙的错误。
|
|
|
|
我建议在访问这样的结构时简单地使用自旋锁(ESP-IDF 中的 taskENTER_CRITICAL/taskEXIT_CRITICAL)。它可以立即清楚您正在尝试做什么(因此如果您重新设计它,就不会进行猜测或出现错误的可能性)并且只要您正确使用自旋锁,无论体系结构如何,它总是安全的。另一种方法是深入研究内存一致性模型,相信我,您不想每次尝试修复一个简单的错误时都这样做。
|
|
|
|
只有小组成员才能发言,加入小组>>
192个成员聚集在这个小组
加入小组470 浏览 1 评论
1648 浏览 2 评论
642浏览 6评论
536浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
515浏览 5评论
517浏览 4评论
507浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-23 12:21 , Processed in 0.573590 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191