私の問題
pthreads ベースの CLI アプリケーションで、異なるスレッド間で多次元連想配列を共有しようとしています。私が遭遇している問題は、以前のキーを上書きせずにキーと値を割り当てることです。
簡単な例
実際のコードで達成しようとしていることを反映した簡単な例を作成しました。
class MyWork extends Worker {
public function __construct($log) {
$this->log = $log;
}
public function getLog() {
return $this->log->getLog();
}
public function run() {}
}
class Log extends Threaded {
private $log;
public function __construct() {
$this->log = new class extends Threaded {
public function run() {}
};
}
public function run(){}
public function report() {
print_r($this->log['foo'].PHP_EOL);
print_r($this->log['bar'].PHP_EOL);
}
public function getLog() { return $this->log; }
}
class MyTask extends Threaded {
private $complete=false;
private $i;
public function isComplete() {
return $this->complete;
}
public function run() {
$this->worker->getLog()['bar'][$this->i] = $this->i;
$this->worker->getLog()['foo'][$this->i] = $this->i;
$this->complete= true;
}
public function __construct($i) {
$this->i = $i;
}
}
$log = new Log();
$p = new Pool(4, MyWork::class, [$log]);
foreach(range(0, 20) as $i)
$p->submit(new MyTask($i));
$log->report();
これの出力を希望するのは、foo 配列と bar 配列の両方に 20 個のキーと 1 から 20 の範囲の値があることです。
ただし、これの実際の出力は次のとおりです。
PHP Notice: Indirect modification of overloaded element of class@anonymous has no effect in /home/fraser/Code/AlignDb/src/test.php on line 50
https://github.com/krakjoe/pthreads/blob/master/examples/StackableArray.phpに書かれていることを考えると、これはある程度理にかなっています。 ArrayAccess インターフェイスを実行するように設定されていません。」
Threaded::merge を使用しようとすると、同じキーを持つネストされた配列を連結するのではなく、キーを上書きするか (2 番目の引数が true に設定されている場合)、重複を無視します。
私の質問
Threaded を拡張するときに、複数の次元でキーと値を設定および取得するにはどうすればよいですか?
PHP バージョン 7.04 と Pthreads バージョン 3.1.6 を使用しています。