为了账号安全,请及时绑定邮箱和手机立即绑定

我的golang代码怎么了?

我的golang代码怎么了?

Go
梵蒂冈之花 2021-05-09 17:18:30
这是我的整个源代码:package mainimport (    "sync/atomic"    "unsafe"    "sync"    "fmt"    "time"    "runtime")const (    MAX_DATA_SIZE = 100)// lock free queuetype Queue struct {    head unsafe.Pointer    tail unsafe.Pointer}// one node in queuetype Node struct {    val interface{}    next unsafe.Pointer}// constructorfunc New() (q *Queue) {    queue := new(Queue)    queue.head = unsafe.Pointer(new(Node))    queue.tail = queue.head    return queue}// queue functionsfunc (self *Queue) enQueue(val interface{}) {    newValue := unsafe.Pointer(&Node{val: val, next: nil})    var tail,next unsafe.Pointer    for {        tail = self.tail        next = ((*Node)(tail)).next        if atomic.CompareAndSwapPointer(&next, nil, newValue) {            atomic.CompareAndSwapPointer(&self.tail, tail, newValue)            break        }else{            for next != nil {                tail = next            }        }    }}func (self *Queue) deQueue() (val interface{}, success bool){    var head,next unsafe.Pointer    for {        head = self.head        next = ((*Node)(head)).next        if next == nil {            return nil, false        }else {            if atomic.CompareAndSwapPointer(&(self.head), head, next) {                val = ((*Node)(next)).val                return val, true            }        }    }    return nil, false}func main() {    //runtime.GOMAXPROCS(runtime.NumCPU())    fmt.Println(runtime.GOMAXPROCS(-1))    var wg sync.WaitGroup    wg.Add(20)    queue := New()    for i := 0; i < 10; i++ {        go func() {            defer wg.Done()            for j := 0; j < MAX_DATA_SIZE; j++ {                t := time.Now()                fmt.Println("enqueue111")                fmt.Println("enq = ", t)                fmt.Println("enqueue222")                queue.enQueue(t)            }        }()    }代码停留在fmt.Println(“ enq =”,t)处,但是我不知道为什么,这太奇怪了。
查看完整描述

2 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

我认为出队goroutine一直在运行,试图从空队列中出队,而入队goroutine却饿死了。也许尝试使出队阻塞来给入队运行的机会?如果这不仅仅是为了教育价值,我只会使用渠道

编辑:使用通道的等效版本

package main


import (

    "sync"

    "fmt"

    "time"

    "runtime"

)


const (

    MAX_DATA_SIZE = 100

)


func main() {

    runtime.GOMAXPROCS(runtime.NumCPU())

    fmt.Println(runtime.GOMAXPROCS(-1))

    var wg sync.WaitGroup

    wg.Add(20)

    queue := make(chan interface{})

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

        go func() {

            defer wg.Done()

            for j := 0; j < MAX_DATA_SIZE; j++ {

                t := time.Now()

                queue <- t

            }

        }()

    }


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

        go func() {

            var val interface{}

            defer wg.Done()

            for j := 0; j < MAX_DATA_SIZE; j++ {

                val = <- queue

                fmt.Println("deq = ",val)

            }

        }()

    }


    wg.Wait()

}


查看完整回答
反对 回复 2021-05-17
  • 2 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信