我仍然对以primefaces方式读取和写入变量感到困惑。 对于那些在以前的问题中试图提供帮助的人,请提前抱歉。
今天我被告知,在读取和写入一个32位long
值时,不需要任何Interlocked
函数调用,这会打破我以前的信念 。 实际上,这支持了MSDN所说的内容
对正确对齐的32位变量的简单读取和写入是primefaces操作。 换句话说,您最终只会更新变量的一部分; 所有位都以primefaces方式更新
然后我看看atomic_long
中的atomic_long是做什么的; 其operator=
使用新值对当前值执行_InterlockedExchange()
。
好吧,你引用了文档的摘录,但不是紧随其后的句子:
但是,不保证访问同步。 如果两个线程正在从同一个变量读取和写入,则无法确定一个线程是否会在另一个线程执行其写入操作之前执行其读取操作。
也就是说,虽然操作是primefaces的,即一个线程保证写入所有4个字节,但在另一个允许读取它之前,这并不意味着你将获得正确的值,并且执行的顺序是未知的。
Interlocked函数确保操作以“事务”方式执行,即它将是primefaces的,并且所有线程/处理器将获得最后更新的值 – 否则这不能保证,因为缓存(每个CPU /核心)可以在其本地缓存中保留副本)。 Interlocked函数以及所有同步函数可确保缓存内容同步。
要读取/更新任何共享数据,是的,您需要使用互斥锁。 对于同一进程的线程,一个关键部分将是更可取的,因为它非常快(不可测量的时间跨度,用于确保屏幕输出操作的primefaces性,所以我可以确认这一点)。
今天我被告知在读取和写入32位长的值时不需要任何互锁函数调用
因为它不是真的,至少不是那种通用的。
仅适用于x86,并且仅当32位值类型对齐时,并且该变量实际上使用单个32位宽指令进入内存。 这通常是这种情况,但绝不保证,编译器可能决定优化或不能假设对齐,因此对齐和primefaces存储都没有保证。
这不与MSDN相矛盾; 如果读/写是primefaces的,为什么需要这个Interlocked函数?
atomic_long
没有按照定义对齐,因此正式的函数需要primefaces交换。
此函数生成完整的内存屏障(或栅栏),以确保按顺序完成内存操作。
这是关于primefaces的另一个相关部分 – 它们形成了记忆障碍。
这意味着编译器和处理器都不能重新排序内存访问。 如果你有两个普通的int
变量,你在同一范围内独立编写,编译器可以随意批量处理或重新排序写入。
作为副作用,处理器还将尝试同步缓存,因此您将更快地看到对另一个核心上的primefaces变量所做的更新。
这超出了普通volatile
的影响,这也会阻止重新排序内存访问,但仍然需要花费几微秒等待内存写入在另一个内核上刷新。
如果我使用VS 2005并针对Windows XP,我如何确保布尔变量的primefaces读/写? 我是否必须使用互斥锁或类似的?
是。 好吧,写入是primefaces的,无论哪种方式,但如果您一直使用布尔来表示另一个存储区域现在可以安全访问(例如自旋锁),那么您真的想要内存屏障。
如果读/写操作不是primefaces的,那么它就容易被撕裂; 那是对的吗?
不是bool
,因为它实际上只是一个字节,我不知道任何可能会破坏子字节级变量的架构。
对于所有较大的类型,是的,因为无法保证对齐。 如前所述,你没有任何保证编译器使用primefaces指令,即使它是“免费”的。
以上就是c/c++开发分享联锁function和primefaces性:仍然困惑相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519234.html