
แสดงให้เห็น
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 และหน่วยความจำที่ใช้ร่วมกัน ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน