1

使用以下代码,我期望输出像

AA
BB
AA
AA
AA
BB

代码:

p1 := [ 1 to: 3000 do: [:i | Transcript show: 'AA';cr.] ] newProcess.
p2 := [ 5000 to: 8100 do: [:i | Transcript show: 'BB';cr.] ] newProcess. 
p1 resume.
p2 resume.

但它首先打印所有 AA,然后打印所有 BB。在 Pharo 下工作正常,但不是 VisualWorks。有人可以告诉错误吗?

4

2 回答 2

2

VisualWorks 使用非抢占式多任务处理这意味着当两个进程具有相同的优先级时,一个进程需要让步才能让另一个进程运行。尝试运行以下代码以查看差异:

p1 := [ 1 to: 3000 do: [:i |
    Transcript show: 'AA';cr.
    i \\ 10 = 0 ifTrue: [Processor activeProcess yield]] ] newProcess.
p2 := [ 5001 to: 8101 do: [:i |
    Transcript show: 'BB';cr.
    i \\ 10 = 0 ifTrue: [Processor activeProcess yield]] ] newProcess. 
p1 resume.
p2 resume.
于 2015-01-02T02:27:40.460 回答
1

David Buck 的回答是完美的:进程调度器不是抢占式的,因此两个具有相同优先级的进程将按顺序运行而不是同时运行,除非活动的进程会等待未就绪的信号量或显式让步。

但是 Pharo 和 Squeak 使用相同的非抢占式调度,那么为什么会有区别呢?
它来自 Morphic 交互,很难准确猜测何时/何地,我不是 Morphic 专家...
但是如果您使用 SharedQueue 而不是 Transcript,您将获得与 Visualworks 相同的行为,然后都是“AA”所有'BB':

q := SharedQueue new: 6101.
s1 := Semaphore new.
s2 := Semaphore new.
p1 := [ 1 to: 3000 do: [:i | q nextPut: 'AA']. s1 signal ] newProcess.
p2 := [ 5000 to: 8100 do: [:i | q nextPut: 'BB'.]. s2 signal ] newProcess. 
p1 resume.
p2 resume.
s1 wait.
s2 wait.
q inspect.
于 2015-01-02T15:36:21.957 回答