发布时间:2024-12-23 03:00:10
下面是一个简单的例子,演示了如何使用互斥锁保护一个共享变量:
```go package main import ( "fmt" "sync" ) var count int var mutex sync.Mutex func increment() { mutex.Lock() defer mutex.Unlock() count++ } func main() { var wg sync.WaitGroup for i := 0; i < 1000; i++ { wg.Add(1) go func() { defer wg.Done() increment() }() } wg.Wait() fmt.Println("Count:", count) } ``` 在上面的例子中,我们使用互斥锁 mutex 来保护 count 变量的访问。通过调用 Lock() 和 Unlock() 方法,我们确保每次只有一个 goroutine 能够执行 count++ 操作。这样,我们就可以安全地对 count 变量进行增加操作,而不会发生竞争条件。下面是一个简单的例子,演示了如何使用条件变量来实现生产者-消费者模型:
```go package main import ( "fmt" "sync" "time" ) var buffer []int var mutex sync.Mutex var cond = sync.NewCond(&mutex) func produce() { for i := 0; i < 10; i++ { mutex.Lock() buffer = append(buffer, i) fmt.Println("Produced:", i) cond.Signal() mutex.Unlock() time.Sleep(1 * time.Second) } } func consume() { for { mutex.Lock() for len(buffer) == 0 { cond.Wait() } value := buffer[0] buffer = buffer[1:] fmt.Println("Consumed:", value) mutex.Unlock() } } func main() { go produce() go consume() time.Sleep(10 * time.Second) } ``` 在上面的例子中,我们使用条件变量 cond 和互斥锁 mutex 来控制生产者和消费者的执行顺序。生产者通过调用 cond.Signal() 来通知消费者有新的数据可用,而消费者则通过调用 cond.Wait() 来等待新的数据到达。这样,我们就可以实现生产者-消费者模型的线程安全通信。