![]() |
1
4
在多处理器或多核机器中,每个核心都有自己的缓存,因此每个核心都有自己潜在的不同“视图”,以了解系统内存的内容。 线程同步机制负责核心之间的同步,有关更多信息,请参阅 http://blogs.msdn.com/oldnewthing/archive/2008/10/03/8969397.aspx 或谷歌获取和发布语义 |
![]() |
2
11
除了写下新的价值,
(顺便说一句,32位写入不能保证是原子的。例如,考虑写操作未对齐且跨越缓存边界的情况。) |
![]() |
3
10
这对于确保另一个线程不会在您刚写入一个不同的值是必要的。例如,假设您试图增加一个变量。您可以读取该值,添加1,然后使用
|
![]() |
4
3
设置一个32位的值是原子的,但前提是要设置一个文本。 B=A为2个操作:
理论上,第一次和第二次操作之间可能会有一些中断。 |
![]() |
5
3
默认情况下,写入值永远不是原子的。将值写入变量时,将生成多个机器指令。使用现代的抢占式操作系统,操作系统可能会在写入的各个操作之间切换到另一个线程。 在多处理器机器上,这更是一个问题,多个线程可以同时执行,并试图同时写入单个内存位置。 互锁操作通过使用专门的指令进行写操作(x86有针对这种情况的专门指令),从而避免这种情况,后者在一条指令中执行读-修改-写操作。这些指令还锁定所有处理器的内存总线,以确保没有其他执行线程可以同时写入该值。 |
![]() |
6
2
interlockedexchange确保变量的更改及其原始值的返回不会被其他线程中断。 因此,如果“i”是int,则这些调用(单独进行)不需要在“i”周围进行互锁交换:
这些语句都不依赖于“i”的初始值和最终值。但以下调用确实需要围绕“i”进行互锁交换:
如果没有它,通过同一代码运行的两个线程可能会得到分配给“a”或“a”的相同值“i”,这可能会意外地跳过两个或更多的数字。
两个线程都可以执行假定只发生一次的代码。
|
![]() |
7
-1
哇,这么多矛盾的答案。很难筛选出谁是对的,谁是错的,以及哪些信息是误导性的。 我也不确定答案,鉴于以上一半的答案,但我认为它是这样工作的,我可能是错的,如果我是:
|
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |
![]() |
user1700890 · 了解交互式代理Python API中的线程 2 年前 |
![]() |
AntonBoarf · 为什么要将实例变量指定给局部变量? 2 年前 |
![]() |
rhymes · 如何让线程操作相同的java列表 2 年前 |