Как изменить глобальный массив внутри многопоточной функции

Я пытаюсь добавить значение в глобальный массив внутри функции. Вызов функции является многопоточным, и несколько экземпляров функции вызываются мгновенно.

Каждый поток изменяет массив, но перезаписывает данные, записанные в него другими потоками.

Мой код ниже:

Function QuickPing { 

    param ($LastByte) 
    $P = New-Object -TypeName "System.Net.NetworkInformation.Ping" 
    if (($P.Send("200.200.200.$LastByte")).status -eq "success"){
        echo "this one responded 200.200.200.$LastByte"
        $global:alive+ = "200.200.200.$LastByte" 
        $global:alive
    }
} 
$global:alive = @()


1..255 | Start-Parallel -Command QuickPing -MaxThreads 500 

write-host $alive

и результат ниже:

PS C:\WINDOWS\system32> E:\scripts_during_phase2\ping_array.ps1
this one responded 200.200.200.1
200.200.200.1
this one responded 200.200.200.17
200.200.200.17
this one responded 200.200.200.254
200.200.200.254


PS C:\WINDOWS\system32> $alive

PS C:\WINDOWS\system32> 

Как видно выше, значение в массиве $ alive перезаписывается каждый раз при вызове этой функции.

Как убедиться, что $alive содержит 200.200.200.1,200.200.200.17,200.200.200.254 при запуске команды write-host $alive

Start-Parallel кажется настраиваемым модулем, основанным на RunspaceFactory Class. На самом деле есть явное примечание из дизайна *Remember that RunSpaces don’t share anything*, что в целом не верно для RunSpaces, поскольку вы можете обмениваться информацией с SessionStateProxy Class, но это, по-видимому, не реализовано в этом решении.
iRon 10.08.2018 09:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
66
1

Ответы 1

Используйте замок.

https://en.wikipedia.org/wiki/Lock_(computer_science)

Это гарантирует, что только один поток будет иметь доступ к массиву одновременно.

А как поделить состояние замка? Это в основном решение Словить 22, если вы не уточните, как это реализовать для этого вопроса.

iRon 10.08.2018 10:10

Другие вопросы по теме