2013-10-27 18 views
40

Sau khi (tóm tắt) xem lại thông số ngôn ngữ Go, hiệu ứng Go và mô hình bộ nhớ Go, tôi vẫn chưa hiểu rõ cách các kênh Go hoạt động dưới mui xe.Kênh Go được triển khai như thế nào?

Loại cấu trúc nào? Chúng hoạt động giống như hàng đợi/mảng an toàn.

Việc triển khai của chúng có phụ thuộc vào kiến ​​trúc không?

Trả lời

56

Tệp nguồn cho kênh là (từ gốc mã nguồn đi của bạn) trong /src/pkg/runtime/chan.go.

hchan là cấu trúc dữ liệu trung tâm cho kênh, với việc gửi và nhận danh sách được liên kết (giữ con trỏ đến goroutine và phần tử dữ liệu) và cờ closed. Có một cấu trúc nhúng Lock được định nghĩa trong runtime2.go và có vai trò như một mutex (futex) hoặc semaphore tùy thuộc vào hệ điều hành. Việc triển khai khóa nằm trong lock_futex.go (Linux/Dragonfly/Some BSD) hoặc lock_sema.go (Windows/OSX/Plan9/Some BSD), dựa trên các thẻ xây dựng.

Hoạt động kênh đều được triển khai trong tệp chan.go này, vì vậy bạn có thể xem makechan, gửi và nhận các thao tác cũng như cấu trúc được chọn, đóng, len và tạo nắp.

Để có giải thích sâu sắc về hoạt động bên trong của kênh, bạn phải đọc Go channels on steroids bởi chính Dmitry Vyukov (Đi lõi dev, goroutines, lên lịch và các kênh khác).

Các vấn đề liên quan