Bất kỳ đối tượng không có nguồn gốc từ định nghĩa pthreads sẽ được tuần tự hóa khi thiết lập nó là một thành viên của một đối tượng có nguồn gốc từ pthreads.
Thao tác như + = và [] sử dụng con trỏ trong nội bộ, việc tuần tự hóa không tương thích với con trỏ cho các đối tượng khác. Trong cuốn hướng dẫn trên trang giới thiệu, nó khẳng định rằng bất kỳ đối tượng dự định sẽ được điều khiển bởi nhiều ngữ cảnh nên mở rộng Stackable, Chủ đề hoặc Worker, như
<?php
class Sum extends Stackable {
private $value = 0;
public function add($inc) { $this->value += $inc; }
public function getValue() { return $this->value; }
public function run(){}
}
class MyThread extends Thread {
public $sum;
public function __construct(Sum $sum) {
$this->sum = $sum;
}
public function run(){
for ($i=0; $i < 10; $i++) {
$this->sum->add(5);
echo $this->sum->getValue() . " ";
}
}
}
$sum = new Sum();
$thread = new MyThread($sum);
$thread->start();
$thread->join();
echo $sum->getValue();
?>
Nếu Sum không được sử dụng con trỏ bạn sẽ có tùy chọn thu hồi tham chiếu từ đối tượng luồng sau khi tham gia.
Đây là những thao tác đơn giản, bạn không bắt buộc phải đồng bộ hóa. Thời gian duy nhất bạn nên đồng bộ hóa là khi bạn dự định chờ một đối tượng hoặc thông báo cho một đối tượng.
Các đối tượng đi kèm với pthreads rất phù hợp hơn với môi trường này và không bao giờ được tuần tự hóa.
Xin đừng đọc giới thiệu trong cuốn hướng dẫn và tất cả các ví dụ trong những phương pháp bạn muốn sử dụng để tìm hiểu chính xác những gì là gì, sau đó cảm thấy tự do để hỏi tại sao :)
tôi biết rằng người dùng của PHP aren Nếu chúng ta phải nghiên cứu, nhưng chúng ta đang đẩy phong bì ở đây, bạn sẽ thấy có những cách chính xác để làm mọi thứ một cách không chính xác, hầu hết chúng được ghi lại trong các ví dụ, và bất cứ điều gì mà tôi không chắc chắn sẽ được trích xuất từ tôi trên SO và cuối cùng tìm đường đến tài liệu.
Tôi không chắc chắn nếu ví dụ bạn đã được thử nghiệm trên đối tượng đặc biệt, nhưng mã mà bạn cung cấp không cần phải hai đối tượng, và không nên hai đối tượng trong hai, hãy xem xét những điều sau đây:
<?php
class MyThread extends Thread {
public $sum;
public function run(){
for ($i=0; $i < 10; $i++) {
$this->add(5);
printf("%d ", $this->sum);
}
}
public function add($num) { $this->sum += $num; }
public function getValue() { return $this->sum; }
}
$thread = new MyThread();
$thread->start();
$thread->join();
var_dump($thread->getValue());
?>
Nó có thể hữu ích để bạn có thể xem các tính năng một vài chi tiết trong hành động với một lời giải thích, vì vậy ở đây đi, đây là một ví dụ tương tự như của bạn:
<?php
class MyThread extends Thread {
public $sum;
public function __construct() {
$this->sum = 0;
}
public function run(){
for ($i=0; $i < 10; $i++) {
$this->add(5);
$this->writeOut("[%d]: %d\n", $i, $this->sum);
}
$this->synchronized(function($thread){
$thread->writeOut("Sending notification to Process from %s #%lu ...\n", __CLASS__, $thread->getThreadId());
$thread->notify();
}, $this);
}
public function add($num) { $this->sum += $num; }
public function getValue() { return $this->sum; }
/* when two threads attempt to write standard output the output will be jumbled */
/* this is a good use of protecting a method so that
only one context can write stdout and you can make sense of the output */
protected function writeOut($format, $args = null) {
$args = func_get_args();
if ($args) {
vprintf(array_shift($args), $args);
}
}
}
$thread = new MyThread();
$thread->start();
/* so this is synchronization, rather than joining, which requires an actual join of the underlying thread */
/* you can wait for notification that the thread is done what you started it to do */
/* in these simple tests the time difference may not be apparent, but in real complex objects from */
/* contexts populated with more than 1 object having executed many instructions the difference may become very real */
$thread->synchronized(function($thread){
if ($thread->getValue()!=50) {
$thread->writeOut("Waiting for thread ...\n");
/* you should only ever wait _for_ something */
$thread->wait();
$thread->writeOut("Process recieved notification from Thread ...\n");
}
}, $thread);
var_dump($thread->getValue());
?>
này kết hợp một số tính năng nâng cao hơn trong một số ví dụ đơn giản và được nhận xét để giúp bạn. Về chủ đề chia sẻ các đối tượng, không có gì sai khi truyền xung quanh một đối tượng Thread nếu nó chứa một số chức năng và dữ liệu cần thiết trong các chủ đề khác hoặc stackables. Bạn nên cố gắng sử dụng càng ít chủ đề và đối tượng càng tốt để hoàn thành công việc.
Có mã đó trong một lớp chính xác là những gì tôi đã đề xuất cho mục đích thử nghiệm. Tôi nghĩ anh ấy cần hai lớp vì anh ấy muốn đếm từ nhiều chủ đề. – th3falc0n
Tôi đã mở rộng câu trả lời để trang trải khả năng này ... sử dụng càng ít càng tốt là thứ tự của ngày khi làm việc với đa luồng.Một thước đo hiệu quả không phải là số lượng đề tài mà ứng dụng của bạn sử dụng, nhưng nó sử dụng số lượng chủ đề ít nhất có thể để hoàn thành công việc trong thời gian ngắn nhất như thế nào. –
Một từ đúng. Threading thực sự là một bước đi trên các cạnh. – th3falc0n