безопасное хранение данных. Я читал, что для этой задачи подходит 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();
Как вы видете, Составная В классе есть много методов, в основном используемых для асинхронных операций, и они могут помочь вам в вашей проблеме. Вы должны изменить ваши асинхронные классы следующим образом:
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);
Других решений пока нет …