gpt4 book ai didi

multithreading - 何时使用 Test&Set 或 Test&Test&Set?

转载 作者:行者123 更新时间:2023-12-03 15:47:18 33 4
gpt4 key购买 nike

x86 下的并行编程可能很困难,尤其是在多核 CPU 下。假设我们有多核 x86 CPU 和更多不同的多线程通信组合。

  1. 单一作者和单一读者
  2. 单个读者多个作者
  3. 多个读者和单个作者
  4. 多个读者和多个作者

那么哪种模型对于锁定共享内存区域更好(更有效):Test&SetTest&Test&Set 以及何时使用它!

这里我有两个简单的(没有时间限制的)测试程序,在Delphi IDE下用x86汇编器编写:

procedure TestAndSet(const oldValue, newValue: cardinal; var destination);
asm
//eax = oldValue
//edx = NewLockValue
//ecx = destination = 32 bit pointer on lock variable 4 byte aligned
@RepeatSpinLoop:
push eax //Save lock oldValue (compared)
pause //CPU spin-loop hint
lock cmpxchg dword ptr [ecx], edx
pop eax //Restore eax as oldValue
jnz @RepeatSpinLoop //Repeat if cmpxchg wasn't successful
end;

procedure TestAndTestAndSet(const oldValue, newValue: cardinal; var destination);
asm
//eax = oldValue
//edx = NewLockValue
//ecx = destination = 32 bit pointer on lock variable 4 byte aligned
@RepeatSpinLoop:
push eax //Save lock oldValue (compared)
@SpinLoop:
pause //CPU spin-loop hint
cmp dword ptr [ecx], eax //Test betfore test&set
jnz @SpinLoop
lock cmpxchg dword ptr [ecx], edx
pop eax //Restore eax as oldValue
jnz @RepeatSpinLoop //Repeat if cmpxchg wasn't successful
end;

编辑:

英特尔在文档中提到了两种方法Test&Set 或Test&Test&Set。我不会确定在哪种情况下有人会更好,因此何时使用它。检查:Intel

最佳答案

当然,第一个 (testAndSet) 更好,因为第二个在使用 cmp 和 jnz 之间重复测试时并没有取得多大成果。当您执行此操作时,目标值可能会发生变化,因为它未锁定。

关于multithreading - 何时使用 Test&Set 或 Test&Test&Set?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4299656/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com