有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推………现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:A:1 2 3 4 1 2….B:2 3 4 1 2 3….C:3 4 1 2 3 4….D:4 1 2 3 4 1….请设计程序。
考察: 多线程编程 思路: 每一个线程向一个缓冲池中写入数据。 轮询从缓冲池中读取数据
package main import ( "fmt" "os" "time" ) func p(i int, c chan int) { for { c <- i } } type FS struct { fd *os.File //文件描述符 next int //文件下一个待写入的数据 } func main() { var cs [4](chan int) for i := 1; i <= 3; i++ { cs[i] = make(chan int, 128) } fmt.Println("init chan") for i := 1; i <= 3; i++ { go p(i, cs[i]) } //这里需要使用create函数, open函数打开的文件只读, 文件创建, 写入测试 if ff, err := os.Create("0"); err == nil { defer ff.Close() if _, err := ff.WriteString("test"); err != nil { panic(fmt.Sprintf("write test ff + %v", err)) } } fmt.Println("init fd") var fs [4]FS for i := 1; i <= 3; i++ { if f, err := os.Create(fmt.Sprintf("%d", i)); err == nil { fs[i] = FS{f, i} if _, err := f.WriteString("test"); err != nil { fmt.Printf("test write err. %v", err) f.Close() panic(err) } } else { fmt.Printf("open file err. i:%d, err:%v", i, err) } } fmt.Println("write fd") defer func() { for i := 1; i <= 3; i++ { fs[i].fd.Close() } }() for { n := 0 for i := 1; i <= 3; i++ { c := cs[i] select { case n = <-c: //某时刻从某个channel中读到数据之后就写入 fmt.Printf("read %d from cs[%d]\n", n, i) case <-time.After(time.Second * 3): //3s的延迟还没有从特定的channel中获取到数据, 直接跳到下一个channel中读取数据 continue } //n := <-cs[i] for j := 1; j <= 3; j++ { if n == fs[j].next { if ret, err := fs[j].fd.WriteString(fmt.Sprintf("%d", n)); err == nil { fs[j].next = fs[j].next%3 + 1 //轮换文件下一个待写入的数据 fmt.Printf("write %d into fd[%d], ret:%d\n", n, j, ret) } else { fmt.Println(err) } } } time.Sleep(time.Second * 1) } } }