一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Linux Golang如何进行并发控制

时间:2026-08-03 11:56:49 编辑:袖梨 来源:一聚教程网

在Golang中,我们可以使用goroutines和channels来实现并发控制。goroutines是轻量级的线程,可以在程序中同时运行多个任务。channels则用于在goroutines之间传递数据和同步操作。

Linux Golang如何进行并发控制

以下是一些常用的并发控制方法:

  1. 使用sync.WaitGroup等待一组goroutines完成:
package mainimport ("fmt""sync")func main() {var wg sync.WaitGroupfor i := 0; i < 5; i++ {wg.Add(1)go func(i int) {defer wg.Done()fmt.Printf("Goroutine %dn", i)}(i)}wg.Wait()fmt.Println("All goroutines finished")}
  1. 使用sync.Mutex实现互斥锁,防止多个goroutines同时访问共享资源:
package mainimport ("fmt""sync")var counter intvar mutex sync.Mutexfunc increment() {mutex.Lock()defer mutex.Unlock()counter++}func main() {wg := sync.WaitGroup{}for i := 0; i < 5; i++ {wg.Add(1)go func() {defer wg.Done()increment()}()}wg.Wait()fmt.Println("Counter:", counter)}
  1. 使用sync.RWMutex实现读写锁,允许多个goroutines同时读取共享资源,但在写入时需要独占锁:
package mainimport ("fmt""sync""time")var data map[string]stringvar rwMutex sync.RWMutexfunc readData(key string) {rwMutex.RLock()defer rwMutex.RUnlock()value := data[key]fmt.Printf("Read %s: %sn", key, value)}func writeData(key, value string) {rwMutex.Lock()defer rwMutex.Unlock()data[key] = valuefmt.Printf("Write %s: %sn", key, value)}func main() {data = make(map[string]string)wg := sync.WaitGroup{}wg.Add(1)go func() {defer wg.Done()writeData("key1", "value1")}()for i := 0; i < 5; i++ {wg.Add(1)go func(i int) {defer wg.Done()key := fmt.Sprintf("key%d", i)readData(key)}(i)}wg.Wait()}
  1. 使用sync.Cond实现条件变量,用于在特定条件下阻塞和唤醒goroutines:
package mainimport ("fmt""sync""time")var cond = sync.NewCond(&sync.Mutex{})var ready boolfunc worker(id int) {cond.L.Lock()for !ready {cond.Wait()}fmt.Printf("Worker %d startedn", id)cond.L.Unlock()}func main() {for i := 0; i < 5; i++ {go worker(i)}time.Sleep(1 * time.Second)cond.L.Lock()ready = truecond.Broadcast()cond.L.Unlock()time.Sleep(1 * time.Second)}

这些方法可以帮助你在Golang中实现并发控制。根据你的需求选择合适的方法,并确保正确地使用锁和其他同步原语以避免竞态条件和死锁。

热门栏目