0

我必须有办法让四个线程大致同时从某个点运行。例如

thread 1 : mov eax,ebx, mov ecx, edx, [S], mov eax, edx, ...
thread 2:  sbb eax,ebx, [S], mov ecx, edx, ...
thread 3:  mov eax,ebx, xchg eax,ebx, cmp edx, ecx, [S], mov eax, ebx, ...
thread 4:  dec eax, sub eax,ecx, [S], ....

[S] 是“同步点”的占位符。在所有线程都达到这一点后,它们应该大致同时启动。我该怎么做呢?

我拥有的代码类似于

number_of_threads 4

temp:
      dd 0            ;a 'synchronization variable'

线程 1 代码

;synchronization [S]

lock add [temp],0x1
wloop1:                 
cmp [temp], number_of_threads 
jne wloop1

线程 2 代码

;synchronization [S]

lock add [temp],0x1
wloop2:                 
cmp [temp], number_of_threads 
jne wloop2

线程 3 代码

;synchronization [S]

lock add [temp],0x1
wloop3:                 
cmp [temp], number_of_threads 
jne wloop3

线程 4 代码

;synchronization [S]

lock add [temp],0x1
wloop4:                 
cmp [temp], number_of_threads 
jne wloop4

通过这种方式,我们确保所有线程都到达 [S] 并大致同时从那里开始。[S] 后面的代码只有在 temp 变为 number_of_threads 时才会执行 这段代码是否存在诸如race之类的问题?我什至不确定这是否是这样做的方法。

4

1 回答 1

1

这是一种方法,我没有看到竞争条件。但是,它肯定会因为忙于等待而占用您的线程。如果预计等待时间很短,这还不错,但是对于超过一毫秒左右的等待时间,您确实应该使用操作系统提供的同步原语。在等待时旋转该循环会像糖果一样消耗 CPU 周期,如果这些等待时间很长,您会注意到性能问题。

在 Windows 上,您将使用Synchronization Barrier。Linux 世界中可能有类似的东西。我不能肯定地说,因为我对 Linux 编程不太熟悉。

您可能对 x86 Pause 指令感兴趣,它可以减少 CPU 负载。这个答案有一个很好的描述。

于 2013-08-08T17:09:07.763 回答