线程之间共享变量

package main

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

// 计数器
var count int

// 创建互斥对象,通过互斥对象加锁保护count变量,同一时间只能一个协程访问
var mu sync.Mutex

func main() {
    for i := 0; i < 2 ; i++ {
        // 循环创建两个协程,执行匿名函数
        go func() {
            // 加锁
            mu.Lock()
            // 延迟释放锁 - 匿名函数执行结束才会释放锁
            defer mu.Unlock()
              
            // 下面的代码同一时间只有一个协程在运行 
            // 对count累加计数
            for j :=0 ; j < 100 ; j++ {
                count++
                // 休眠10毫秒
                time.Sleep(10 * time.Millisecond)
            }
        }()
    }

    // 先休眠5秒,等前面的协程执行结束
    time.Sleep(5 * time.Second)

    // 打印计数值
    fmt.Println(count)
}

线程之间的变量可以是共享的,这是线程与进程最大的不同之一。在同一个进程中,所有线程共享该进程的内存空间,包括数据段、堆和(部分)栈。这意味着,同一个进程内的线程可以直接访问和修改相同的全局变量、静态变量和堆上的对象,而无需通过特定的进程间通信(IPC)机制。

线程共享的资源包括:
全局变量:在进程的全局数据区中定义的变量,所有线程都可以直接访问。
堆内存:动态分配的内存(如C语言中的malloc或C++中的new分配的内存),在进程的堆区域中,所有线程都可以访问和修改。
文件描述符和其他资源:如打开的文件、网络连接等,也是由进程中的所有线程共享的。
线程独有的资源:
线程栈:每个线程有自己的栈空间,用于存储局部变量和调用栈。这部分内存是线程私有的,其他线程不能直接访问。
共享变量的同步问题
由于线程可以共享内存,所以在设计多线程程序时,同步和数据一致性成为了重要的考虑因素。如果多个线程同时读写同一个共享变量,而没有适当的同步机制(如互斥锁、信号量等),就可能导致竞态条件,使程序的行为变得不可预测。

使用同步机制
为了安全地在多个线程间共享变量,开发者需要使用同步机制,如:

互斥锁(Mutex):确保同时只有一个线程可以访问共享资源。
读写锁(Read-Write Lock):允许多个读操作同时进行,但写操作是互斥的。
条件变量:允许线程在特定条件下挂起和唤醒。
原子操作:确保变量的读取、修改和写入是不可分割的操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值