2015-01-01 3 views
1

С follwing кода, я ожидаю выход какSmalltalk Визуальные работы параллельности

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. 

Но он сначала печатает все ААС, а затем все ББ. Работает под управлением Pharo, но не VisualWorks. Может кто-нибудь сказать об ошибке?

+1

Я бы не сказал, что это «ошибка». Я вижу два процесса с одним и тем же приоритетом, один в очереди за другим. Что заставляет вас думать, что каждый из процессов должен уступить, а другой - работать в среде, не имеющей превентивного характера? –

ответ

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. 
+0

Pharo ведет себя по-разному; это потому, что он превентивный? –

+0

@LeandroCaniglia no, Squeak/Pharo также не имеют превентивного планирования. Это должно произойти от некоторого морфического взаимодействия (я не могу точно сказать, где и когда) - см. Мой ответ –

1

Ответ Дэвид Бак идеально подходят: процесс планировщик не упреждающий, поэтому два процесса одинакового приоритета будет выполняться последовательно, а не одновременно, если активный один будет дождитесь неготовного семафора или явно уступите.

Но Pharo и Squeak используют одно и то же не упреждающее планирование, так почему же разница?
Это связано с морфическим взаимодействием, очень сложно угадать, где именно и когда, я не эксперт по морфию ...
Но если вы используете 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. 
Смежные вопросы