请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于协程方便的数据同步问题

老师好,以前跟着您学到Python高级开发,当时讲过线程和进程为什么需要做数据同步,以及锁的作用。因为线程和进程都有单独的内核空间,且线程需要把变量拷贝到自己的线程栈上,因此产生了数据不一致的问题。
但是很奇怪协程为什么也有这样的问题啊?照说它们运行在一个系统级线程中,都是共享的相同的变量才对啊,又不存在把变量拷贝到自己的栈上

正在回答

2回答

你能通过写代码来举例说明一下问题吗? 比如协程同步的问题?

0 回复 有任何疑惑可以回复我~
  • 提问者 邱晨100 #1
    我写过了,就跟着您课堂上的代码,发现和多线程一样,多个协程共同操作一个数值最后导致不上嘴后想要的结果
    回复 有任何疑惑可以回复我~ 2021-05-04 09:58:10
  • bobby 回复 提问者 邱晨100 #2
    你把代码贴一下把
    回复 有任何疑惑可以回复我~ 2021-05-04 10:12:21
  • 提问者 邱晨100 回复 bobby #3
    下面有哈,加了锁之后的确解决问题了。其实我知道多线程之间也是这样解决线程同步的问题的。我的疑惑是,协程都是在一个线程栈上,理应用的一个栈上变量啊,这样照说不会出现互相吧对象修改的值覆盖的问题啊
    回复 有任何疑惑可以回复我~ 2021-05-04 10:20:08
提问者 邱晨100 2021-05-04 10:18:51

package main


import (

"fmt"

"sync"

)


var total int

var wg sync.WaitGroup

var lock sync.Mutex


//互斥锁 读写锁 数据同步 能不用锁就不用锁

func add() {

defer wg.Done()

for i := 0; i < 100000; i++ {

lock.Lock()

total += 1

lock.Unlock()

}

}

func sub() {

defer wg.Done()

for i := 0; i < 100000; i++ {

lock.Lock()

total -= 1

lock.Unlock()

}

}

func main() {


wg.Add(2)

go add()

go sub()

wg.Wait()

fmt.Println(total)

}



0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号