почему оператор сна дает такой результат для нашего встроенного ruby? - PullRequest
1 голос
/ 06 сентября 2011

Мы тестируем взаимодействие потоков для нашего встроенного рубина. У нас есть расширение C ruby, в котором реализованы следующие методы

1. longRunningMethod()
2. shortRunningMethod().

Вот код для проверки взаимодействия потоков

// файл test.rb

require 'mymodule'

$a = 0;
obj = MyModule::MyClass.new
t1 = Thread.new{$a = obj.veryLongRunningOperation(); puts "doneLong"}
sleep 1
$a = obj.shortOperation()
puts "doneShort"
t1.join

Мы убедились, что longRunningMethod занимает более 1 секунды (5 секунд) для выполнения, используя вложенные циклы for Согласно нашему пониманию, сначала следует завершить shortRunningMethod, а затем longRunningMethod.

Однако мы наблюдали это только тогда, когда у нас не было команды сна. Но когда мы ввели выражение «сон 1». Сначала выполняется longRunningMethod, а затем shortRunningMethod

Кто-нибудь даст нам указание на то, почему оператор сна дает такой результат?

[Мы используем ruby ​​1.8.6] Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 06 сентября 2011

Потоки в Ruby 1.8 не используют собственные механизмы потоков в ОС. Все потоки Ruby фактически выполняются в одном собственном потоке (без параллельного выполнения).

Ваши методы C являются атомарными, поэтому планировщик потоков ждет, пока они не вернутся, прежде чем переключать потоки Ruby. Вот почему, как только он начинает делать longRunningMethod, прежде чем доберется до shortRunningMethod, он больше ничего не делает, пока не закончит. Вы испытываете то, что называется «голодная нить».

Один из способов избежать этого - реализовать ваш longRunningMethod таким образом, чтобы он периодически вызывал sleep.

0 голосов
/ 06 сентября 2011

Поток автоматически запускается сразу после его создания? В Java нужно явно вызвать t1.start(), чтобы запустить поток. Может быть, то же самое в Ruby.

t1.join может иметь дополнительные функции, которые он проверяет, запущен ли уже поток, а если нет, запускается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...