|
|
|
@@ -2,12 +2,11 @@ package sync2 |
|
|
|
|
|
|
|
import ( |
|
|
|
"sync" |
|
|
|
"sync/atomic" |
|
|
|
) |
|
|
|
|
|
|
|
func ParallelDo[T any](args []T, fn func(val T, index int) error) error { |
|
|
|
err := atomic.Value{} |
|
|
|
err.Store((error)(nil)) |
|
|
|
lock := sync.Mutex{} |
|
|
|
var err error |
|
|
|
|
|
|
|
var wg sync.WaitGroup |
|
|
|
wg.Add(len(args)) |
|
|
|
@@ -16,10 +15,15 @@ func ParallelDo[T any](args []T, fn func(val T, index int) error) error { |
|
|
|
defer wg.Done() |
|
|
|
|
|
|
|
if e := fn(arg, index); e != nil { |
|
|
|
err.CompareAndSwap((error)(nil), e) |
|
|
|
lock.Lock() |
|
|
|
if err == nil { |
|
|
|
err = e |
|
|
|
} |
|
|
|
lock.Unlock() |
|
|
|
} |
|
|
|
}(arg, i) |
|
|
|
} |
|
|
|
wg.Wait() |
|
|
|
return err.Load().(error) |
|
|
|
|
|
|
|
return err |
|
|
|
} |