PHP 세마포어의 기본 사용 예에 대한 자세한 설명
이 기사의 예에서는 PHP 세마포어의 기본 사용법을 설명합니다. 다음과 같이 참조할 수 있도록 모든 사람과 공유하십시오.
일부 이론적 근거:
세마포어: 세마포어라고도 알려져 있으며 프로세스(스레드 동기화 문제)를 해결하는 데 사용되며 소수와 유사합니다. 잠그고, 액세스하기 전에 잠금을 획득하고(얻을 수 없는 경우 대기), 액세스한 후 잠금을 해제합니다.
중요 리소스: 한 번에 하나의 프로세스만 액세스가 허용되는 리소스입니다.
크리티컬 섹션: 크리티컬 리소스에 액세스하는 각 프로세스의 코드 섹션을 크리티컬 섹션이라고 합니다.
프로세스 상호 배제: 두 개 이상의 프로세스가 동일한 공유 변수 집합에 대해 동시에 크리티컬 섹션에 들어갈 수 없습니다. 즉, 한 프로세스가 다른 프로세스가 액세스하기 위해 기다려야 하는 중요한 리소스에 액세스하고 있습니다.
프로세스 동기화는 주로 여러 프로세스 간의 실행 순서를 결정하고 데이터 경쟁 문제를 피하는 방법, 즉 여러 프로세스가 함께 잘 실행되도록 하는 방법을 연구합니다.
예: (바이두 백과사전에서)
주차장 운영을 예로 들어보겠습니다. 단순화를 위해 주차장에 주차 공간이 3개만 있고 처음에는 3개의 주차 공간이 모두 비어 있다고 가정합니다. 이때, 5대의 차량이 동시에 오면 문지기는 그 중 3대가 직접 진입하도록 허용한 후, 나머지 차량은 입구에서 대기해야 하며, 후속 차량도 대기해야 합니다. 입구. 이때 주차장에서 차가 한 대 빠져나갔는데, 문지기가 이 사실을 알고 차문을 열고 차를 댔다. 차가 두 대 더 남으면 두 대를 더 넣을 수 있는 식이었다.
이 주차장 시스템에서는 주차 공간이 공공 자원입니다. 각 차량은 스레드와 같고 게이트 키퍼는 세마포어 역할을 합니다.
$key=ftok(__FILE__,'t'); /** * 获取一个信号量资源 int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]] $max_acquire:最多可以多少个进程同时获取信号 $perm:权限 默认 0666 $auto_release:是否自动释放信号量 */ $sem_id=sem_get($key); #获取信号 sem_acquire($seg_id); //do something 这里是一个原子性操作 //释放信号量 sem_release($seg_id); //把次信号从系统中移除 sem_remove($sem_id); //可能出现的问题 $fp = sem_get(fileinode(__DIR__), 100); sem_acquire($fp); $fp2 = sem_get(fileinode(__DIR__), 1)); sem_acquire($fp2);
PHP에서 읽기-쓰기 세마포 구현:
class rw_semaphore { const READ_ACCESS = 0; const WRITE_ACCESS = 1; /** * @access private * @var resource - mutex semaphore */ private $mutex; /** * @access private * @var resource - read/write semaphore */ private $resource; /** * @access private * @var int */ private $writers = 0; /** * @access private * @var int */ private $readers = 0; /** * Default constructor * * Initialize the read/write semaphore */ public function __construct() { $mutex_key = ftok('/home/cyrus/development/php/sysvipc/rw_semaphore.php', 'm'); $resource_key = ftok('/home/cyrus/development/php/sysvipc/rw_semaphore.php', 'r'); $this->mutex = sem_get($mutex_key, 1); $this->resource = sem_get($resource_key, 1); } /** * Destructor * * Remove the read/write semaphore */ public function __destruct() { sem_remove($this->mutex); sem_remove($this->resource); } /** * Request acess to the resource * * @param int $mode * @return void */ private function request_access($access_type = self::READ_ACCESS) { if ($access_type == self::WRITE_ACCESS) { sem_acquire($this->mutex); /* update the writers counter */ $this->writers++; sem_release($this->mutex); sem_acquire($this->resource); } else { sem_acquire($this->mutex); if ($this->writers > 0 || $this->readers == 0) { sem_release($this->mutex); sem_acquire($this->resource); sem_acquire($this->mutex); } /* update the readers counter */ $this->readers++; sem_release($this->mutex); } } private function request_release($access_type = self::READ_ACCESS) { if ($access_type == self::WRITE_ACCESS) { sem_acquire($this->mutex); /* update the writers counter */ $this->writers--; sem_release($this->mutex); sem_release($this->resource); } else { sem_acquire($this->mutex); /* update the readers counter */ $this->readers--; if ($this->readers == 0) sem_release($this->resource); sem_release($this->mutex); } } /** * Request read access to the resource * * @return void */ public function read_access() { $this->request_access(self::READ_ACCESS); } /** * Release read access to the resource * * @return void */ public function read_release() { $this->request_release(self::READ_ACCESS); } /** * Request write access to the resource * * @return void */ public function write_access() { $this->request_access(self::WRITE_ACCESS); } /** * Release write access to the resource * * @return void */ public function write_release() { $this->request_release(self::WRITE_ACCESS); } }
공유 메모리 신호는 원자 연산을 구현합니다
$SHM_KEY = ftok("/home/joeldg/homeymail/shmtest.php", 'R'); $shmid = sem_get($SHM_KEY, 1024, 0644 | IPC_CREAT); $data = shm_attach($shmid, 1024); // we now have our shm segment // lets place a variable in there shm_put_var ($data, $inmem, "test"); // now lets get it back. we could be in a forked process and still have // access to this variable. printf("shared contents: %s\n", shm_get_var($data, $inmem)); shm_detach($data);
위의 예는 PHP 매뉴얼 sem_get 함수 주석에서 가져온 것입니다
더 많은 PHP 관련 콘텐츠에 관심이 있는 독자는 이 사이트의 특별 주제인 "소개"를 확인할 수 있습니다. PHP 기본 문법 튜토리얼", "PHP 오류 및 예외 처리 방법 요약", "PHP 프로그래밍 알고리즘 요약" 및 "PHP 객체 지향 프로그래밍 소개 튜토리얼"
이 기사가 도움이 되기를 바랍니다. PHP 프로그래밍에 종사하는 여러분.
이상에서는 PHP 세마포어의 기본적인 사용예를 내용적인 면까지 포함하여 자세히 소개하였습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되었으면 좋겠습니다.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Logitech의 인기 있는 Harmony 원격 제어 장치가 사라진 이후 고품질 범용 원격 제어 장치 시장은 기껏해야 조각화되었습니다. Unfolded Circle은 모든 서버 의무나 하위 항목을 제거하여 Harmony Ultimate의 운명을 피하는 것을 목표로 합니다.

DeepSeek은 파일을 PDF로 직접 변환 할 수 없습니다. 파일 유형에 따라 공통 문서 (Word, Excel, PowerPoint) : Microsoft Office, LibreOffice 및 기타 소프트웨어를 사용하여 PDF로 내보내십시오. 이미지 : 이미지 뷰어 또는 이미지 처리 소프트웨어를 사용하여 PDF로 저장하십시오. 웹 페이지 : 브라우저의 "PDF로 인쇄"기능 또는 전용 웹 페이지에서 PDF 도구를 사용하십시오. 드문 형식 : 오른쪽 변환기를 찾아 PDF로 변환하십시오. 올바른 도구를 선택하고 실제 상황에 따라 계획을 개발하는 것이 중요합니다.

Oracle은 다음 단계를 통해 dbf 파일을 읽을 수 있습니다. 외부 테이블을 만들고 dbf 파일을 참조하여 데이터를 Oracle 테이블로 가져옵니다.

Nintendo Switch(Amazon에서 295달러에 구입 가능)는 주로 The Legend of Zelda: Breath of the Wild와 같은 최고급 독점 타이틀로 인해 눈에 띕니다. 그러나 타사 개발자의 중요한 릴리스가 부족합니다. 닌텐도 스위치 2는 아마도

AI 지원 Deepin Linux 배포판이 V23 RC2라는 최신 업데이트를 받았습니다. 이 버전의 Deepin에는 다양한 패키지 업데이트와 새로운 기능이 포함되어 있습니다. 그러나 기능이 전부는 아닙니다. 모양과 느낌이 t의 주요 스포트라이트입니다.

우리는 이전에 곧 출시될 전기 포르쉐 박스터의 팬 누출에 대해 보고했으며 포르쉐는 이전에 2030년까지 판매량의 80%를 EV 제조에 전념했으며 전기 박스터와 케이맨 모델이 일반 가솔린-P와 함께 도입될 것이라고 확인했습니다.

Node.js 환경에서 403을 반환하는 타사 인터페이스의 문제를 해결하십시오. Node.js를 사용하여 타사 인터페이스를 호출 할 때 때때로 403을 반환하는 인터페이스에서 403의 오류가 발생합니다 ...

Laravel 프레임 워크 및 Laravel 프레임 워크 및 Redis를 사용할 때 Redis 연결을 공유하는 데 영향을 줄 수 있습니다. 개발자는 문제가 발생할 수 있습니다. 구성을 통해 ...
