Это должно дать Вам, в чем Вы нуждаетесь:
Система использования. Безопасность. Принципал;
...
var sid = WindowsIdentity. GetCurrent ().User;
Свойство пользователя WindowsIdentity возвращает SID, на Документы MSDN
Абстракция производитель / потребитель, использующая вытесняющие потоки и сообщения, передаваемые через канал:
import Data.Char
import Control.Concurrent
import Control.Concurrent.Chan
main = do
c <- newChan
cs <- getChanContents c -- a lazy stream of events from eventReader
forkIO (producer c) -- char producer
consumer cs
where
-- thread one: the event producer
producer c = forever $ do
key <- getChar
writeChan c key
-- thread two: the lazy consumer
consumer = mapM_ print . map shift
where shift c | isAlpha c = chr (ord c + 1)
| otherwise = c
Вы могли бы использовать аналогичную модель в Erlang. Потоки, представляющие потребителя и производителя, и общий канал сообщений между ними, каждый из которых действует асинхронно.
Я добавлю к отличному ответу dons
, что основной механизм здесь - это нечто, называемое MVar
, и это императивный параллельный контейнер по стоимости. Вы «вставляете» и «входите» в MVar и выходите из него. Получение пустых блоков MVar, как и установка полного. Это одновременно механизм связи и механизм синхронизации. Я считаю, что он был изобретен Арвиндом в рамках проекта Monsoon / * t. Есть красивая книга Нихила и Арвинда , в которой объясняется их pH-диалект параллельного Haskell. Многие идеи были приняты в GHC, и книгу стоит прочитать.
glob
в скалярном контексте:
В скалярном контексте glob выполняет итерацию через такие расширения имен файлов, возвращая undef, когда список исчерпан.
В
foreach (@list_env_vars){
print "$_ = ".glob()."\n";
}
] glob ()
действительно существует glob ($ _)
. На каждой итерации $ _
содержит строку $ SERVER
. Учитывая, что переменная среды не изменяется, $ SERVER
заменяется той же строкой. Эта строка возвращается в первый раз. Затем список исчерпан, поэтому возвращается undef
. В третий раз мы начинаем заново. ...
Уточнение: Не имеет значения, что аргумент для второго вызова тот же, что и для первого вызова, так как нет возможности сбросить итератор glob
.