라이브러리

[PHP] SyncSemaphore::lock - 세마포어의 수를 줄이거나 대기합니다.




SyncSemaphore::lock


PHP 에서 SyncSemaphore::lock은 동기화된 세마포어를 사용하여 동시성 제어를 위한 메커니즘입니다. 세마포어는 한 번에 하나의 프로세스만 특정 리소스에 접근할 수 있도록 하여, 동시성 프로그래밍에서 발생할 수 있는 경쟁 조건을 방지합니다.

# SyncSemaphore::lock 사용법


SyncSemaphore::lock을 사용하기 위해서는 먼저 세마포어를 초기화해야 합니다. 세마포어는 0으로 초기화됩니다.

#hostingforum.kr
php

$semaphore = new SyncSemaphore(1);



이러한 세마포어를 사용하여, 한 번에 하나의 프로세스만 특정 리소스에 접근할 수 있도록 하려면, 세마포어를 잠그는 lock 메서드를 사용합니다.

#hostingforum.kr
php

$semaphore->lock();



리소스에 접근한 후, 세마포어를 잠금에서 해제하는 unlock 메서드를 사용하여 다른 프로세스가 리소스에 접근할 수 있도록 합니다.

#hostingforum.kr
php

$semaphore->unlock();



# 예제


다음 예제에서는 SyncSemaphore::lock을 사용하여 한 번에 하나의 프로세스만 특정 리소스에 접근할 수 있도록 하여, 동시성 프로그래밍에서 발생할 수 있는 경쟁 조건을 방지합니다.

#hostingforum.kr
php

class Counter {

    private $value;

    private $semaphore;



    public function __construct() {

        $this->value = 0;

        $this->semaphore = new SyncSemaphore(1);

    }



    public function increment() {

        $this->semaphore->lock();

        $this->value++;

        $this->semaphore->unlock();

    }



    public function getValue() {

        return $this->value;

    }

}



$counter = new Counter();



$threads = [];



for ($i = 0; $i < 10; $i++) {

    $thread = new class($counter) extends Thread {

        private $counter;



        public function __construct($counter) {

            $this->counter = $counter;

        }



        public function run() {

            for ($i = 0; $i < 10000; $i++) {

                $this->counter->increment();

            }

        }

    };



    $thread->start();

    $threads[] = $thread;

}



foreach ($threads as $thread) {

    $thread->join();

}



echo $counter->getValue(); // 100000



이 예제에서는 한 번에 하나의 프로세스만 `increment` 메서드를 호출할 수 있도록 하여, 동시성 프로그래밍에서 발생할 수 있는 경쟁 조건을 방지합니다.
  • profile_image
    나우호스팅 @pcs8404 

    호스팅포럼 화이팅!

    댓글목록

    등록된 댓글이 없습니다.

  • 전체 8,985건 / 89 페이지

검색

게시물 검색