当前位置: 首页 > 面试题库 >

我的golang代码怎么了?

仲鸿风
2023-03-14
问题内容

这是我的整个源代码:

package main

import (
    "sync/atomic"
    "unsafe"
    "sync"
    "fmt"
    "time"
    "runtime"
)

const (
    MAX_DATA_SIZE = 100
)

// lock free queue
type Queue struct {
    head unsafe.Pointer
    tail unsafe.Pointer
}
// one node in queue
type Node struct {
    val interface{}
    next unsafe.Pointer
}
// constructor
func New() (q *Queue) {
    queue := new(Queue)
    queue.head = unsafe.Pointer(new(Node))
    queue.tail = queue.head
    return queue
}
// queue functions
func (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)
            }
        }()
    }

    for i := 0; i < 10; i++ {
        go func() {
            ok := false
            var val interface{}
            defer wg.Done()
            for j := 0; j < MAX_DATA_SIZE; j++ {
                val,ok = queue.deQueue()
                for !ok {
                    val,ok = queue.deQueue()
                }
                fmt.Println("deq = ",val)
            }
        }()
    }

    wg.Wait()
}

代码卡在了 fmt.Println(“ enq =”,t)上, 但是我不知道为什么,这太奇怪了。


问题答案:

deQueue在失败情况下无限循环,这阻塞了CPU。Goroutine在执行CPU工作时不会屈服。GOMAXPROCS必须大于等于2才能获得CPU并行性。

只是为了踢,这是使用高阶通道的线程安全,无阻塞队列实现:https :
//gist.github.com/3668150



 类似资料:
  • 问题内容: 我已经使用Selenium用Java编写了代码。当我运行代码时,它将引发NullPointerException。检查以下异常 我的代码如下: 问题答案: 您会看到一个原因,因为您从一开始就尝试访问该方法,这需要in的活动实例,即to &and perform 方法。 解决方案是先访问该方法,以便您拥有and 的活动实例。接下来,您可以访问方法。 这是您的工作代码块:

  • 我使用Selenium编写了Java代码。当我运行代码时,它会抛出NullPointerException。检查下面的异常 我的代码如下:

  • 我看过一些关于这个问题的帖子,我想我的逻辑和他们的答案差不多。但我找不到我到底错在哪里。 我的代码首先检查提供的的长度,如果长度小于或等于2,则自动返回. 接下来,它删除()第一个元素,并检查其余元素是否按升序排列。 如果不符合顺序,它将用序列替换它,并重复第二步,但这次将删除下一个元素()。 这将继续进行,直到不再有要移除的元素,最终返回 如果在任何迭代中发现列表是升序的,则函数返回. 这是代码

  • 问题内容: 我试图进行搜索并弄清楚它是如何工作的,但是我很难找到一个解释。 如果我的变量类型为() 怎么办?我知道接口可以代表很多事情,但是他在这里发生的事情的高层概述是什么? 问题答案: 这是一个类型断言: 类型断言提供对接口值的基础具体值的访问。 https://tour.golang.org/methods/15 如果该断言不成立,则会引发恐慌。要测试该值是否为特定类型T,可以使用以下命令:

  • 但我怎么才能阻止码头服务器呢?我听说了一些关于stop.jar和start.jar的事情。我能在哪里找到它?它集成在Jetty-all-jar中吗?

  • 采用的是 nutz-source.jar 的方式存放源码 Ecipse 用户 打开 window > Preferebces > General > Workspace 看看 "Text file encoding" 项是不是设成 "UTF-8" 了 还是不行? 请重启你的Eclipse 全局UTF-8设置, 打开eclipse.ini,在末尾加入 -Dfile.encoding