Данные в хранилище не изменяются из потока

безопасное хранение данных. Я читал, что для этой задачи подходит Stackable.
Я наследую Stackable, но данные в хранилище не синхронизируются.
AsyncOperation — просто увеличение значения в хранилище
AsyncWatcher — просто делает эхо значения в хранилище.

Проблема: данные в хранилище не изменяются из потока AsyncOperation, хранилище постоянно содержит -1.

Я использую pthreads.

class Storage extends Stackable {
public function __construct($data) {
$this->local = $data;
}
public function run()
{
}
public function getData() { return $this->local; }
}class AsyncOperation extends Thread {
private $arg;

public function __construct(Storage $param){
$this->arg = $param->getData();
}

public function run(){
while (true)  {
$this->arg++;
sleep(1);
}
}
}

class AsyncWatcher extends Thread {
public function __construct(Storage  $param){
$this->storage = $param -> getData();
}

public function run(){
while (true) {
echo "In storage ". $this->storage ."\n";

sleep(1);
}
}
}

$storage = new Storage(-1);

$thread = new AsyncOperation($storage);
$thread->start();

$watcher = new AsyncWatcher($storage);
$watcher->start();

0

Решение

Как вы видете, Составная В классе есть много методов, в основном используемых для асинхронных операций, и они могут помочь вам в вашей проблеме. Вы должны изменить ваши асинхронные классы следующим образом:

class AsyncOperation extends Thread {
private $arg;

public function __construct(Storage $param){
$this->arg = $param->getData();
}

public function run(){
while (true)  {
$this->arg++;
sleep(1);
}

$this->synchronized(function($thread){
$thread->notify();
}, $this);
}

}

и их использование будет таким:

$storage = new Storage();
$asyncOp = new AsyncOperation($storage);
$asyncOp->start();

$asyncOp->synchronized(function($thread){
$thread->wait();
}, $asyncOp);

var_dump($storage);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]