Как упоминалось в golang doc, синхронизация предназначена для низкоуровневых библиотечных процедур.Что такое правильный способ использования golang sync.WaitGroup
Помимо типов Once и WaitGroup, большинство из них предназначено для использования в низкоуровневых библиотечных подпрограммах . Более качественная синхронизация лучше осуществляется через каналы и связь.
Я не совсем понимаю это утверждение, и я использую синхронизацию, как в примере ниже.
Моя цель - только допустить, что основная тема будет ждать окончания всех остальных потоков, аналогично .join()
в библиотеке потоков C++.
Вопросы:
1: Правильно ли использовать синхронизацию? Или я должен использовать канал вместо синхронизации?
2: В чем разница между каналом и синхронизацией?
var wg sync.WaitGroup // declare the variable globally
func send(a string, b string){
defer wg.Done()
// do something
}
func main(){
for i:=0; i<50; i++ {
wg.Add(1) // add delta
go send("1111", "2222")
}
wg.Wait() // wait until wg becomes 0
}
Любые предложения ценятся! Благодаря!
Я не уверен, что вы просите, вы ваш 'send' goroutine имеет другой' sync.WaitGroup', чем в 'главный()', так что нет никакой синхронизации происходит. – JimB
@JimB эй, извините за смутное заявление! Я обновил. На самом деле я использую sync здесь, чтобы сделать что-то вроде '.join()' в C++-потоке. Из документа, канал также может сделать это. Правильно ли использовать синхронизацию? – Eagle
Да, для чего предназначена WaitGroup; ожидая группы горти. Я не понимаю вопроса о «правильном способе использования синхронизации», так как это целый пакет, и вы используете то, что он предоставляет, когда вам это нужно. Это невозможно использовать 'sync.WaitGroup', поскольку значение' wg' в 'main' отличается от значения' wg' в 'send'. – JimB