如何在多线程函数中修改全局数组

时间:2018-08-10 01:20:11

标签: .net windows multithreading function powershell

我正在尝试向函数内的全局数组添加值。该函数调用是多线程的,并且该函数的多个实例被即时调用

每个线程都会修改该数组,但会覆盖其他线程写入该数组的数据。

我的代码如下:

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

1 个答案:

答案 0 :(得分:0)

使用锁。

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

这将确保一次只有一个线程可以访问该数组