sách gpt4 ai đã đi

Loại trừ lẫn nhau cho các coroutine đồng thời

In lại Tác giả: IT Prince Thời gian cập nhật: 2023-10-29 01:40:19 28 4
mua khóa gpt4 Nike

Trong mã của tôi có ba chương trình chạy đồng thời. Tôi cố gắng cung cấp một cái nhìn tổng quan ngắn gọn về mã của tôi,

Thói quen 1 {
làm gì đó

*Gửi int đến Routine 2
Gửi int đến Routine 3
In cái gì đó
In cái gì đó*

làm gì đó
}

Thói quen 2 {
làm gì đó

*Gửi int đến Routine 1
Gửi int đến Routine 3
In cái gì đó
In cái gì đó*

làm gì đó
}

Thói quen 3 {
làm gì đó

*Gửi int đến Routine 1
Gửi int đến Routine 2
In cái gì đó
In cái gì đó*

làm gì đó
}

chủ yếu {
thói quen1
thói quen2
thói quen3
}

Tôi muốn rằng trong khi mã giữa hai goroutine (mã giữa hai dấu sao) đang thực thi, luồng điều khiển không thể chuyển đến các goroutine khác. Ví dụ, trong khi thói quen 1 đang thực hiện hai sự kiện giữa các ngôi sao (sự kiện gửi và sự kiện in), thói quen 2 và 3 phải bị chặn (có nghĩa là luồng thực thi sẽ không chuyển từ thói quen 1 sang thói quen 2 hoặc 3). Sau khi sự kiện in cuối cùng hoàn tất, luồng thực thi có thể chuyển sang quy trình 2 hoặc 3. Có ai có thể giúp tôi bằng cách chỉ rõ cách tôi có thể đạt được điều này không? Có thể vượt qua được không? Nhóm Chờ Thực hiện các thông số kỹ thuật trên? Có ai có thể cho tôi biết cách triển khai ví dụ nêu trên bằng cách sử dụng WaitGroup bằng cách đưa ra một ví dụ đơn giản không? Cảm ơn.

LƯU Ý: Tôi đưa ra hai tùy chọn Gửi và hai tùy chọn In, thực ra có rất nhiều tùy chọn Gửi và In.

1 Câu trả lời

Nếu tôi không nhầm thì điều bạn muốn là ngăn không cho một số phần nhất định của mỗi hàm thực thi đồng thời với các hàm khác. Đoạn mã sau thực hiện điều này: fmt.InIn Dòng này không xuất hiện khi các chương trình khác đang chạy. Sau đây là những gì xảy ra: Khi lệnh thực thi đến phần in, nó sẽ đợi cho đến khi các lệnh khác hoàn tất (nếu chúng đang chạy) và trong khi dòng lệnh in này đang thực thi các lệnh khác, các lệnh khác không khởi động và đợi. Tôi hy vọng đây là những gì bạn đang tìm kiếm. Xin hãy sửa cho tôi nếu tôi sai về điều này.

gói chính

nhập khẩu (
"fmt"
"rand"
"đồng bộ"
)

biến (
mutex1, mutex2, mutex3 đồng bộ.Mutex
wg đồng bộ.WaitGroup
)

hàm Routine1() {
mutex1.Khóa()
// làm gì đó
đối với i := 0; i < 200; i++ {
mutex2.Khóa()
mutex3.Khóa()
fmt.Println("giá trị của z")
mutex2.Mở khóa()
mutex3.Mở khóa()
}
// làm gì đó
mutex1.Mở khóa()
wg.Xong()
}

hàm Routine2() {
mutex2.Khóa()
// làm gì đó
đối với i := 0; i < 200; i++ {
mutex1.Khóa()
mutex3.Khóa()
fmt.Println("giá trị của z")
mutex1.Mở khóa()
mutex3.Mở khóa()
}
// làm gì đó
mutex2.Mở khóa()
wg.Xong()
}

hàm Routine3() {
mutex3.Khóa()
// làm gì đó
đối với i := 0; i < 200; i++ {
mutex1.Khóa()
mutex2.Khóa()
fmt.Println("giá trị của z")
mutex1.Mở khóa()
mutex2.Mở khóa()
}
// làm gì đó
mutex3.Mở khóa()
wg.Xong()
}

hàm main() {
wg.Thêm(3)
đi Routine1()
đi Routine2()
Thói quen3()
wg. Chờ()
}

làm mới: Hãy để tôi giải thích ba mutex này ở đây: Một mutex làtài liệu nói rằng. : "khóa mutex." Điều này có nghĩa là khi bạn gọi Khóa Nếu người khác đã khóa cùng một mutex, mã của bạn sẽ nằm ở đó. Trong cuộc gọi của bạn Mở khóa Sau đó, mã bị chặn sẽ được khôi phục ngay lập tức.

Ở đây tôi đặt mỗi hàm vào mutex riêng của nó bằng cách khóa mutex ở đầu hàm và mở khóa ở cuối hàm. Với cơ chế đơn giản này, bạn có thể tránh phải chạy bất kỳ phần nào của mã bạn muốn cùng lúc với việc chạy các hàm này. Ví dụ, khi Thói quen1 Trong khi chạy, bất cứ nơi nào bạn muốn có mã không nên chạy, chỉ cần khóa ở đầu mã đó mutex1 Mở khóa ở cuối. Đây là tôi Thói quen2Thói quen3 được thực hiện trong hàng thích hợp của Hi vọng điều này có thể làm sáng tỏ mọi việc.

Liên quan đến go - mutex của các coroutine đồng thời, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/8315970/

28 4 0
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com