menjelaskan
1. Semaphore: Ini adalah operasi atom yang disediakan oleh sistem. Kuantitas sinyal hanya dapat dioperasikan oleh satu proses pada waktu yang sama.
Suatu proses mendapat sinyal dan harus dilepaskan oleh proses tersebut.
2. Memori bersama: Ini adalah area memori publik yang dibuka oleh sistem di dalam memori dan dapat diakses oleh proses apa pun.
Pada saat yang sama, beberapa proses dapat mengakses area ini untuk memastikan konsistensi data, area memori ini perlu dikunci atau diberi sinyal.
Contoh
echo "kemajuan induk pid:{$parentPid}n"; $daftaranak = array(); //Buat memori bersama, buat semaphore, dan tentukan kunci bersama $shm_id = ftok(__FILE__,'m'); $sem_id = ftok(__FILE__,'); $shareMemory = shm_attach($shm_id); $sinyal = sem_get($sem_id); konstanta SHARE_KEY = 1; // fungsi produser produser(){ global $shareMemory; global $sinyal; $pid = posix_getpid(); $repeatNum = 5; untuk ( $i = 1; $i <= $repeatNum; $i++) { //Dapatkan semaphore sem_acquire($signal); jika (shm_has_var($shareMemory,SHARE_KEY)){ // Jika ada nilai, tambahkan satu $count = shm_get_var($shareMemory,SHARE_KEY); $hitung++; shm_put_var($shareMemory,SHARE_KEY,$hitungan); echo "({$pid}) jumlah: {$hitungan}n"; }kalau tidak{ // Tidak ada nilai, inisialisasi shm_put_var($shareMemory,SHARE_KEY,0); echo "({$pid}) hitungan: 0n"; } // Rilis setelah digunakan sem_release($signal); $rand = acak(1,3); tidur($rand); } } fungsi createProgress($panggilan balik){ $pid = pcntl_fork(); jika ( $pid == -1) { //Pembuatan gagal keluar("kesalahan progres fork!n"); } lain jika ($pid == 0) { // Program eksekusi subproses $pid = posix_getpid(); $panggilan balik(); exit("({$pid})progres anak berakhir!n"); }kalau tidak{ //Proses induk mengeksekusi program return $pid; } } // 3 proses penulisan untuk ($i = 0; $i < 3; $i ++ ) { $pid = createProgress('produser'); $daftaranak[$pid] = 1; echo "buat progres anak produser: {$pid} n"; } // Tunggu hingga semua proses turunan selesai while(!empty($childList)){ $childPid = pcntl_wait($status); jika ($anakPid > 0){ tidak disetel($DaftarAnak[$AnakPid]); } } // Lepaskan memori bersama dan semaphore shm_remove($shareMemory); sem_remove($sinyal); echo "({$parentPid})progres utama telah selesai!n";
Di atas adalah pengenalan semaphore PHP dan memori bersama, semoga bermanfaat bagi semua orang.