第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我的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貢獻(xiàn)1765條經(jīng)驗 獲得超5個贊

我認(rèn)為出隊goroutine一直在運(yùn)行,試圖從空隊列中出隊,而入隊goroutine卻餓死了。也許嘗試使出隊阻塞來給入隊運(yùn)行的機(jī)會?如果這不僅僅是為了教育價值,我只會使用渠道。

編輯:使用通道的等效版本

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()

}


查看完整回答
反對 回復(fù) 2021-05-17
  • 2 回答
  • 0 關(guān)注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號