list操作崩溃

binghan1589 · 2016-09-20 09:34:15 · 1764 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2016-09-20 09:34:15 的主题,其中的信息可能已经有所发展或是发生改变。

代码如下: package main

import ( "container/list" "fmt" "time" )

var Ch = make(chan int) var DataList = list.New()

func ReadChan() { for { data := <-Ch fmt.Println(data) } }

func WriteChan() { for { if size := DataList.Len(); size > 0 { data := DataList.Front() if data.Value != nil { Ch <- data.Value.(int) DataList.Remove(data) }

    } else {
        time.Sleep(100 * time.Millisecond)
    }
}

}

func feed() { for { for i := 0; i < 20; i++ { DataList.PushBack(i) } time.Sleep(150 * time.Millisecond) } }

func main() {

go WriteChan()
for i := 0; i < 5; i++ {
    go ReadChan()
}
feed()

}

本意是写入的数据放入list中缓存,然后协程写入chan, 其他协程读出,对list的读写操作因为是不同的协程所以不用上锁,程序运行一段时间会崩溃,郁闷。。。


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1764 次点击  
加入收藏 微博
3 回复  |  直到 2016-12-14 07:40:52
stevewang
stevewang · #1 · 8年之前

DataList在多个goroutine里同时被读写,存在数据竞争,需要做线程同步。

stevewang
stevewang · #2 · 8年之前
package main

import (
    "container/list"
    "fmt"
    "sync"
    "time"
)

var Ch = make(chan int)
var DataList = list.New()
var mutex sync.Mutex

func ReadChan() {
    for {
        data := <-Ch
        fmt.Println(data)
    }
}

func WriteChan() {
    for {
        mutex.Lock()
        if size := DataList.Len(); size > 0 {
            data := DataList.Front()
            if data.Value != nil {
                Ch <- data.Value.(int)
                DataList.Remove(data)
            }
            mutex.Unlock()
        } else {
            mutex.Unlock()
            time.Sleep(100 * time.Millisecond)
        }
    }
}

func feed() {
    for {
        for i := 0; i < 20; i++ {
            mutex.Lock()
            DataList.PushBack(i)
            mutex.Unlock()
        }
        time.Sleep(150 * time.Millisecond)
    }
}

func main() {

    go WriteChan()
    for i := 0; i < 5; i++ {
        go ReadChan()
    }
    feed()
}
binghan1589
binghan1589 · #3 · 8年之前
stevewangstevewang #2 回复

``` package main import ( "container/list" "fmt" "sync" "time" ) var Ch = make(chan int) var DataList = list.New() var mutex sync.Mutex func ReadChan() { for { data := <-Ch fmt.Println(data) } } func WriteChan() { for { mutex.Lock() if size := DataList.Len(); size > 0 { data := DataList.Front() if data.Value != nil { Ch <- data.Value.(int) DataList.Remove(data) } mutex.Unlock() } else { mutex.Unlock() time.Sleep(100 * time.Millisecond) } } } func feed() { for { for i := 0; i < 20; i++ { mutex.Lock() DataList.PushBack(i) mutex.Unlock() } time.Sleep(150 * time.Millisecond) } } func main() { go WriteChan() for i := 0; i < 5; i++ { go ReadChan() } feed() } ```

谢谢!确实少了上锁

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传