Является ли порождение нового действующего лица из существующего потока безопасным? - PullRequest
5 голосов
/ 18 мая 2011

Как уже было сказано несколько раз здесь ранее, вы можете создать новый поток (помещая вычисления с длительной обработкой в ​​блок actor{}) внутри субъекта, и порожденные вычисления будут безопасно выполняться в том же пуле потоков (используетсяпланировщик актеров).

actor{
    var i = 0
    case msg => actor {
        // computation
        i = i + 1  // is `i` still thread safe?
                   // looks like it can be access simultaneosly from 2 two threads now
                   // should I make it @volatile?
    } 
    reply(i) 
}

Однако будет ли он поточно-ориентированным и будет ли он следовать, в общем, оригинальному дизайну, в котором говорится, что только один поток в данный момент может работать сактер?

Ответы [ 3 ]

8 голосов
/ 18 мая 2011

порождение актера от другого совершенно безопасно.

Однако делить изменчивое состояние между актерами нельзя, независимо от того, как и где они были созданы.

Весь смысл актеров в том, что они должны общаться с сообщениями через свои почтовые ящики. Злоупотребление этой моделью и субъекты не обеспечивают большей защиты от проблем параллелизма, чем вы получаете с необработанными потоками.

1 голос
/ 18 мая 2011

В вашем примере к i действительно можно получить доступ из нескольких потоков;что делает вычисления и поток, вызывающий ответ.Возможно, вам следует ответить Future?

reply( future { /* perform computation */ } )

. Тогда вызывающий абонент сможет реагировать на входной канал фьючерса (неблокирующий) или просто apply() (блокирующий).

0 голосов
/ 18 мая 2011

Актеры могут обрабатывать только одно сообщение одновременно, поэтому все, что вы делаете внутри своего актора, является поточно-ориентированным, так как вам никогда не приходится думать о безопасности потоков.

Это полная идея для актеров и их параллелизма.

...