Go語(yǔ)言條件變量能用于線程同步嗎

小樊
81
2024-11-02 16:44:30

Go語(yǔ)言的sync.Cond類型是專門(mén)用于線程同步的條件變量。它允許一個(gè)或多個(gè)goroutine等待某個(gè)條件成立,同時(shí)釋放互斥鎖(sync.Mutex),讓其他goroutine繼續(xù)執(zhí)行。當(dāng)條件滿足時(shí),等待的goroutine會(huì)被喚醒并重新獲取互斥鎖。

下面是一個(gè)簡(jiǎn)單的示例,展示了如何使用sync.Cond進(jìn)行線程同步:

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var mu sync.Mutex
	cond := sync.NewCond(&mu)
	data := 0

	for i := 0; i < 10; i++ {
		mu.Lock()
		for data <= 0 {
			cond.Wait()
		}
		data--
		fmt.Printf("Goroutine %d: Data is %d\n", i, data)
		cond.Signal()
		mu.Unlock()
		time.Sleep(1 * time.Second)
	}
}

在這個(gè)示例中,我們創(chuàng)建了一個(gè)互斥鎖mu和一個(gè)條件變量cond。我們使用一個(gè)循環(huán)來(lái)模擬10個(gè)goroutine,每個(gè)goroutine在data大于0時(shí)執(zhí)行。當(dāng)一個(gè)goroutine發(fā)現(xiàn)data小于等于0時(shí),它會(huì)調(diào)用cond.Wait()進(jìn)入等待狀態(tài),并釋放互斥鎖。當(dāng)條件滿足(即data大于0)時(shí),其他goroutine會(huì)被喚醒并繼續(xù)執(zhí)行。

0