แสดงให้เห็น
1. เซมาฟอร์: เป็นการดำเนินการแบบอะตอมมิกที่ได้รับจากระบบ ปริมาณสัญญาณสามารถดำเนินการได้เพียงกระบวนการเดียวเท่านั้นในเวลาเดียวกัน
กระบวนการได้รับสัญญาณและจะต้องถูกปล่อยโดยกระบวนการ
2. หน่วยความจำที่ใช้ร่วมกัน: เป็นพื้นที่หน่วยความจำสาธารณะที่เปิดโดยระบบในหน่วยความจำและสามารถเข้าถึงได้โดยกระบวนการใดก็ได้
ในเวลาเดียวกัน กระบวนการต่างๆ สามารถเข้าถึงพื้นที่นี้ได้ เพื่อให้มั่นใจถึงความสอดคล้องของข้อมูล พื้นที่หน่วยความจำนี้จำเป็นต้องถูกล็อคหรือส่งสัญญาณ
ตัวอย่าง
echo "ความคืบหน้าของผู้ปกครอง pid:{$parentPid}n"; $childList = อาร์เรย์(); //สร้างหน่วยความจำที่ใช้ร่วมกัน สร้างเซมาฟอร์ และกำหนดคีย์ที่ใช้ร่วมกัน $shm_id = ftok(__FILE__,'m'); $sem_id = ftok(__FILE__,'s'); $shareMemory = shm_attach($shm_id); $signal = sem_get($sem_id); const SHARE_KEY = 1; // ฟังก์ชั่นผู้ผลิต โปรดิวเซอร์ () { $shareMemory ทั่วโลก; สัญญาณ $ ทั่วโลก; $pid = posix_getpid(); $repeatNum = 5; สำหรับ ( $i = 1; $i <= $repeatNum; $i++) { //รับสัญญาณ sem_acquire($signal); ถ้า (shm_has_var($shareMemory,SHARE_KEY)){ // หากมีค่า ให้เพิ่ม $count = shm_get_var($shareMemory,SHARE_KEY); $นับ++; shm_put_var($shareMemory,SHARE_KEY,$count); echo "({$pid}) นับ: {$count}n"; }อื่น{ // ไม่มีค่า การเริ่มต้น shm_put_var($shareMemory,SHARE_KEY,0); echo "({$pid}) นับ: 0n"; - // ปล่อยหลังจากใช้งาน sem_release($signal); $แรนด์ = แรนด์(1,3); นอนหลับ($แรนด์); - - ฟังก์ชั่น createProgress($ โทรกลับ) { $pid = pcntl_fork(); ถ้า ( $pid == -1) { //การสร้างล้มเหลว exit("ข้อผิดพลาดความคืบหน้าของส้อม!n"); } อื่นถ้า ($pid == 0) { // โปรแกรมประมวลผลย่อย $pid = posix_getpid(); $โทรกลับ(); exit("({$pid})ความคืบหน้าลูกสิ้นสุด!n"); }อื่น{ // กระบวนการหลักดำเนินการโปรแกรมส่งคืน $pid; - - // 3 กระบวนการเขียนสำหรับ ($i = 0; $i < 3; $i ++ ) { $pid = createProgress('ผู้ผลิต'); $รายการเด็ก[$pid] = 1; echo "สร้างความคืบหน้าลูกของผู้ผลิต: {$pid} n"; - // รอให้กระบวนการย่อยทั้งหมดสิ้นสุดในขณะที่(!empty($childList)){ $childPid = pcntl_wait($สถานะ); ถ้า ($childPid > 0){ unset($childList[$childPid]); - - // ปล่อยหน่วยความจำที่ใช้ร่วมกันและเซมาฟอร์ shm_remove($shareMemory); sem_remove($สัญญาณ); echo "({$parentPid})ความคืบหน้าหลักสิ้นสุด!n";
ข้างต้นเป็นการแนะนำเซมาฟอร์ PHP และหน่วยความจำที่ใช้ร่วมกัน ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน