Kami mempertimbangkan dua proses, masing-masing dipanggil "pengeluar" dan "pengguna". Pengeluar adalah proses kitaran dan setiap kali ia melalui kitarannya ia menghasilkan bahagian tertentu maklumat, yang mesti diproses oleh pengguna. Pengguna juga merupakan proses kitaran dan setiap kali ia melalui kitarannya, ia boleh memproses maklumat seterusnya, kerana ia dihasilkan oleh pengeluar. Contoh mudah diberikan melalui proses pengiraan, yang menghasilkan sebagai "bahagian maklumat" imej kad tebukan untuk ditebuk oleh kad tebukan, yang memainkan peranan sebagai pengguna.[1]
Pengeluar mencipta item dan menyimpannya dalam struktur data, manakala pengguna mengalih keluar item daripada struktur itu dan memprosesnya.
Jika penggunaan lebih besar daripada pengeluaran, penimbal (struktur data) dikosongkan dan pengguna tidak mempunyai apa-apa untuk dimakan
Jika penggunaan kurang daripada pengeluaran, penimbal akan terisi dan pengeluar tidak dapat menambah lebih banyak item. Ini ialah masalah klasik yang dipanggil penampan terhad.
Andaikan kami mempunyai pengeluar yang menerbitkan e-mel dalam penimbal dan pengguna yang menggunakan e-mel daripada penimbal dan memaparkan mesej yang menyatakan bahawa e-mel telah dihantar dengan kata laluan akses baharu untuk e-mel yang dimaklumkan.
package main import ( "fmt" "os" "strconv" "sync" "time" ) type buffer struct { items []string mu sync.Mutex } func (buff *buffer) add(item string) { buff.mu.Lock() defer buff.mu.Unlock() if len(buff.items) < 5 { buff.items = append(buff.items, item) // fmt.Println("Foi adicionado o item " + item) } else { fmt.Println("O Buffer não pode armazenar nenhum item mais está com a capacidade máxima") os.Exit(0) } } func (buff *buffer) get() string { buff.mu.Lock() defer buff.mu.Unlock() if len(buff.items) == 0 { return "" } target := buff.items[0] buff.items = buff.items[1:] return target } var wg sync.WaitGroup func main() { buff := buffer{} wg.Add(2) go producer(&buff) go consumer(&buff) wg.Wait() } func producer(buff *buffer) { defer wg.Done() for index := 1; ; index++ { str := strconv.Itoa(index) + "@email.com" buff.add(str) time.Sleep(5 * time.Millisecond) // Adiciona um pequeno atraso para simular produção } } func consumer(buff *buffer) { defer wg.Done() for { data := buff.get() if data != "" { fmt.Println("Enviado um email com a nova senha de acesso para: " + data) } } }
Pautan kod: https://github.com/jcelsocosta/race_condition/blob/main/producerconsumer/buffer/producerconsumer.go
https://www.cin.ufpe.br/~cagf/if677/2015-2/slides/08_Concorrencia%20(Jorge).pdf
Atas ialah kandungan terperinci Pengeluar/Pengguna. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!