PHP 8.6.0 Beta 1 is available for testing

Threaded::notify

(PECL pthreads >= 2.0.0)

Threaded::notifyСинхронизация

Описание

public function Threaded::notify(): bool

Отправляет уведомление указанному объекту.

Список параметров

Сигнатура функции не содержит параметров.

Возвращаемые значения

Функция возвращает true , если выполнилась успешно, или false , если возникла ошибка.

Примеры

Пример #1 Уведомления и ожидание

<?php
class My extends Thread {
 public function run() {
 /** заставить этот поток ждать **/
 $this->synchronized(function($thread){
 if (!$thread->done)
 $thread->wait();
 }, $this);
 }
}
$my = new My();
$my->start();
/** отправить уведомление ожидающему потоку **/
$my->synchronized(function($thread){
 $thread->done = true;
 $thread->notify();
}, $my);
var_dump($my->join());
?>

Результат выполнения приведённого примера:

bool(true)

Нашли ошибку?

ИнструкцияИсправлениеСообщение об ошибке
+Добавить

Примечания пользователей 1 note

up
-4
cottton at i-stats dot net
11 years ago
Seems like some operators dont work.
f.e. $thread->array[] = 1; fails
a simple test:
<?php
class My extends Thread
{
 public
 $array = array('default val 1', 'default val 2'),
 $msg = 'default',
 $stop = false;
 public function run()
 {
 while(true)
 {
 echo $this->msg . PHP_EOL;
 if(count($this->array) > 0){
 foreach($this->array as $val){
 var_dump($val);
 }
 $this->array = array();
 }
 /** cause this thread to wait **/
 $this->synchronized(
 function($thread){
 if(count($this->array) < 1){
 $thread->wait();
 }
 },
 $this
 );
 echo PHP_EOL;
 if($this->stop){
 break;
 }
 } // while
 }
}
$my = new My();
$my->start();
sleep(1); // wait a bit
// test 1 - $thread->array[] = 1;
$my->synchronized(
 function($thread){
 $thread->msg = 'test 1';
 $thread->array[] = 1;
 $thread->notify();
 },
 $my
);
sleep(1); // wait a bit
// test 2 - array_push($thread->array, 2);
$my->synchronized(
 function($thread){
 $thread->msg = 'test 2';
 array_push($thread->array, 2);
 $thread->notify();
 },
 $my
);
sleep(1); // wait a bit
// test 3 - array_push($thread->array, 2);
$my->synchronized(
 function($thread){
 $thread->msg = 'test 3';
 $new = array(3);
 $thread->array = array_merge($thread->array, $new);
 $thread->notify();
 },
 $my
);
sleep(1); // wait a bit
$my->stop = true;
?>
out:
default
string(13) "default val 1"
string(13) "default val 2"
test 1
test 2
test 3
int(3)
so in this case only array_merge() worked.
+Добавить

AltStyle によって変換されたページ (->オリジナル) /