婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP pthreads v3下同步處理synchronized用法示例

PHP pthreads v3下同步處理synchronized用法示例

熱門標簽:濟源百應電銷機器人聯系方式 南京3D地圖標注 嘟嘟云外呼系統 辦理400電話哪家好點 邢臺400電話辦理 正規電銷機器人系統 南寧電話外呼系統線路 重慶外呼電銷系統多少錢 咸陽電銷

本文實例講述了PHP pthreads v3下同步處理synchronized用法。分享給大家供大家參考,具體如下:

之所以會用到同步,是因為如果多個線程中對同一個資源進行操作時,會發生混亂。

比如2個線程對變量進行加1操作,第1個線程還沒來的及改寫數據時,第2個線程就對變量進行操作了,那變量最終的結果就是未知的,這個時候就需要同步來進行控制了。

例子如下:

?php
class Count extends Thread
{
  public $cnt = 0;

  public function run()
  {
    $this->add();
  }

  public function add()
  {
    //對成員進行加1操作
    for ($i = 0; $i  100000; $i++) {
      ++$this->cnt;
    }
  }
}

$c = new Count();
//調用start()時,線程run()中就調用了add()方法
$c->start();
//我們人為再調用一次add()方法,這時候就會有兩個for循環對$cnt進行操作
$c->add();
//把創建的線程加入主線程中,讓主線程等待子線程運行結束
$c->join();

//這里輸出就是不確定性的
var_dump($c->cnt);

多次運行后,$cnt的值是不確定的。如下圖所示:

在pthreads v2中我們可以用Mutex,不過在v3版本中被刪除了,所以我們可以簡單的把加1操作放到synchronized中進行同步,代碼如下:

?php
class Count extends Thread
{
  public $cnt = 0;

  public function run()
  {
    $this->add();
  }

  public function add()
  {
    $this->synchronized(function () {
      //對成員進行加1操作
      for ($i = 0; $i  100000; $i++) {
        ++$this->cnt;
      }
    });
  }
}

$c = new Count();
//調用start()時,線程run()中就調用了add()方法
$c->start();
//我們人為再調用一次add()方法,這時候就會有兩個for循環對$cnt進行操作
$c->add();
//把創建的線程加入主線程中,讓主線程等待子線程運行結束
$c->join();

//這里就會一直輸出200000
var_dump($c->cnt);

結果如下所示:

當然我們也可以通過notify()和wait()進行同步控制,代碼如下:

?php
class Task extends Thread
{
  public $flag = 1;

  public function run()
  {
    $this->synchronized(function () {
      //標識不為1就一直等待
      if ($this->flag !== 1) {
        $this->wait();
      }

      for ($i = 1; $i = 10; $i++) {

        echo "flag : {$this->flag} i : {$i} \n";

        if ($this->flag === 1) {
          //設置標識
          $this->flag = 2;
          //發送喚醒通知,然后讓當前線程等待
          //注意,notify()與wait()順序不要搞錯了,不然會一直阻塞
          $this->notify();
          $this->wait();
        }
      }

      //我們在這里再次調用notify()
      //因為在最后一次輸出flag : 2 i : 20時,當前線程的i已經變成11了,跳出了for循環,
      //但另一個線程則一直阻塞在wait()那里,程序無法結束,所以需要notify()再次喚醒一次
      $this->notify();
    });
  }
}

$t = new Task();
$t->start();

$t->synchronized(function ($obj) {
  //標識不為2就一直等待
  if ($obj->flag !== 2) {
    $obj->wait();
  }

  for ($i = 11; $i = 20; $i++) {

    echo "flag : {$obj->flag} i : {$i} \n";

    if ($obj->flag === 2) {
      $obj->flag = 1;
      $obj->notify();
      $obj->wait();
    }
  }
}, $t);

//把創建的線程加入主線程中,讓主線程等待子線程運行結束
$t->join();

結果如下圖所示:

我們通過notify()和wait()控制了兩個for循環,來回的輸出變量i的值,保證了順序性。

我們再來看一個復雜點的例子,共享的資源,如果不進行同步操作,會出現不可預知的情況,代碼如下: 

?php
class Task extends Thread
{
  private $name;
  private $file;

  public function __construct($name, $file)
  {
    $this->name = $name;
    $this->file = $file;
  }

  public function run()
  {
    $data = file_get_contents($this->file);
    $data = floatval($data);
    for ($i = 0; $i  100000; $i++) {
      ++$data;
    }
    file_put_contents($this->file, $data);
    echo "task : {$this->name} data : {$data} \n";
  }
}

$tasks = [];
$file = './test.log';

for ($i = 0; $i  100; $i++) {
  $tasks[$i] = new Task($i, $file);
  $tasks[$i]->start();
}

for ($i = 0; $i  100; $i++) {
  $tasks[$i]->join();
}

我們開100個線程對文件test.log進行讀寫,理想狀態下,test.log中的數據應該是每次增加10000000的。現在的電腦配置都比較好,大家可以多運行幾次就可以看出效果。

 很明顯最后的數據好像少了200000,多線程下對test.log文件進行讀寫,而我們又沒有加鎖,顯然是會出現數據混亂的。

現在我們修改一下代碼,如下:

?php
class File extends Thread
{
  private $file;

  public function __construct($file)
  {
    $this->file = $file;
  }

  public function inc()
  {
    //進行同步控制,當100個task線程調用inc方法時,synchronized可以保證塊內的代碼是同步的
    //注意,注意,不要把inc方法寫到Task里,那樣是沒效果的,因為每個task線程都是獨立空間,他們各自調各自的inc方法,是沒法做到同步的
    //常用的做法是我們要同步哪些資源,就為這些資源寫個Thread類,并提供操作這些資源的方法,并在方法里加上synchronized
    return $this->synchronized(function () {
      $data = file_get_contents($this->file);
      $data = floatval($data);
      for ($i = 0; $i  100000; $i++) {
        ++$data;
      }
      file_put_contents($this->file, $data);
      return $data;
    });
  }
}

class Task extends Thread
{
  private $name;
  private $file;

  public function __construct($name, $file)
  {
    $this->name = $name;
    $this->file = $file;
  }

  public function run()
  {
    $data = $this->file->inc();
    echo "task : {$this->name} data : {$data} \n";
  }
}

$tasks = [];
$file = new File('./test.log');

for ($i = 0; $i  100; $i++) {
  $tasks[$i] = new Task($i, $file);
  $tasks[$i]->start();
}

for ($i = 0; $i  100; $i++) {
  $tasks[$i]->join();
}

結果如下圖所示,當然為了保險起見,我們可以試著多運行幾次,下面是我運行了25次的結果:

更多關于PHP相關內容感興趣的讀者可查看本站專題:《PHP進程與線程操作技巧總結》、《PHP網絡編程技巧總結》、《PHP基本語法入門教程》、《PHP數組(Array)操作技巧大全》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

您可能感興趣的文章:
  • PHP pthread拓展使用和注意點
  • PHP pthreads v3下worker和pool的使用方法示例
  • PHP pthreads v3使用中的一些坑和注意點分析
  • php使用pthreads v3多線程實現抓取新浪新聞信息操作示例
  • PHP中使用pthread拓展

標簽:南通 河南 武漢 平頂山 黃山 隴南 通遼 唐山

巨人網絡通訊聲明:本文標題《PHP pthreads v3下同步處理synchronized用法示例》,本文關鍵詞  PHP,pthreads,下,同步,處理,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP pthreads v3下同步處理synchronized用法示例》相關的同類信息!
  • 本頁收集關于PHP pthreads v3下同步處理synchronized用法示例的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    成人性生交大片免费看在线播放| 日韩欧美另类在线| 国产高清无密码一区二区三区| 天天影视网天天综合色在线播放| 精品一区二区三区av| 另类人妖一区二区av| 国产精品一区二区在线看| 99热这里都是精品| 欧美日韩免费在线视频| 国产丝袜在线精品| 男女激情视频一区| 欧美性色欧美a在线播放| 日韩精品中文字幕一区二区三区| 一个色在线综合| 国产精品中文字幕日韩精品| 欧美日韩视频在线一区二区| 亚洲蜜臀av乱码久久精品| 国产白丝精品91爽爽久久| 日韩欧美第一区| 午夜精品福利在线| 欧美日韩不卡在线| 亚洲激情六月丁香| 不卡的电视剧免费网站有什么| 欧美www视频| 美女视频免费一区| 久久亚洲影视婷婷| 精品一区二区三区不卡| 北条麻妃国产九九精品视频| 日韩区在线观看| 美女视频黄免费的久久| 欧美电影影音先锋| 首页亚洲欧美制服丝腿| 精品理论电影在线观看 | 国产乱淫av一区二区三区| 欧美大片一区二区| 久久精品国产久精国产| 欧美国产激情一区二区三区蜜月| 国产做a爰片久久毛片| 亚洲韩国一区二区三区| 亚洲一区二区三区在线| 天堂蜜桃91精品| 国产亚洲成年网址在线观看| 国产91在线观看| 亚洲国产欧美日韩另类综合| 欧美一区二区高清| 成人一级视频在线观看| 久久精品一区二区三区四区| 国产一区二区女| 亚洲一区二区免费视频| 久久精品欧美日韩精品| 色综合久久综合中文综合网| 天天综合日日夜夜精品| 国产精品系列在线| 久久免费视频一区| 欧美tickling网站挠脚心| 高清在线不卡av| 蜜臀av一区二区三区| 成人免费小视频| 久久亚洲一级片| 亚洲精品一线二线三线无人区| 色婷婷综合久久久中文字幕| 成人在线视频一区| 亚洲自拍偷拍图区| 国产三级一区二区三区| 日韩视频免费观看高清完整版| 欧洲精品一区二区| 91丨九色porny丨蝌蚪| 不卡一区二区在线| 精品久久久久99| 成人免费精品视频| 日日夜夜精品免费视频| 亚洲福利国产精品| 午夜在线电影亚洲一区| 青青草一区二区三区| 五月综合激情婷婷六月色窝| 日本女优在线视频一区二区| 午夜伦理一区二区| 免费观看成人av| 国产在线看一区| 蜜桃精品视频在线| 中文字幕欧美一| 亚洲欧美自拍偷拍色图| 亚洲精品亚洲人成人网在线播放| 亚洲午夜精品在线| 韩国av一区二区三区在线观看| 日韩精品91亚洲二区在线观看| 日产国产高清一区二区三区| 国产一区二区成人久久免费影院| 精品无码三级在线观看视频| 91最新地址在线播放| 欧美三电影在线| 91黄色在线观看| 欧美刺激午夜性久久久久久久| 久久综合999| 亚洲欧美视频一区| 久久aⅴ国产欧美74aaa| 91成人免费电影| 国产三级精品视频| 国产精品视频一区二区三区不卡| 性做久久久久久免费观看 | 国产精品女主播在线观看| 亚洲在线一区二区三区| 国产老妇另类xxxxx| 国产一区二区影院| 欧美日韩国产综合视频在线观看| 日韩欧美一区在线| 午夜不卡在线视频| 国产成人午夜高潮毛片| 99re6这里只有精品视频在线观看| 欧美日韩视频专区在线播放| 1024亚洲合集| 色婷婷精品大在线视频| 亚洲欧洲精品成人久久奇米网| 国产精品性做久久久久久| 欧美日韩一区在线观看| 欧美精品一区二区三区在线| 久久精品久久99精品久久| 4438亚洲最大| 午夜精品福利视频网站| av一区二区三区在线| 亚洲老司机在线| 欧美精品乱码久久久久久按摩 | 久久久精品一品道一区| 国产盗摄一区二区三区| 久久精品一二三| 91久久久免费一区二区| 日韩国产欧美在线播放| 国产精品午夜免费| 久久久国际精品| 欧美电影免费观看完整版| 在线视频你懂得一区二区三区| 国产精品中文字幕日韩精品| 午夜免费久久看| 亚洲综合色噜噜狠狠| 一区在线中文字幕| 中文字幕一区二区三区在线观看| 精品久久久久久久人人人人传媒| 91精品国产色综合久久久蜜香臀| 日本福利一区二区| 日本乱人伦aⅴ精品| 91论坛在线播放| 日本乱码高清不卡字幕| 欧美影院午夜播放| 在线不卡一区二区| 制服丝袜在线91| 日韩精品在线看片z| 精品粉嫩超白一线天av| 久久久精品蜜桃| 亚洲欧美电影院| 香蕉乱码成人久久天堂爱免费| 亚洲成av人片在线观看无码| 奇米精品一区二区三区在线观看| 日韩成人dvd| 成人精品视频网站| 欧美日韩另类国产亚洲欧美一级| 欧美精品一级二级| 国产亚洲一区二区在线观看| 国产精品私人影院| 日本 国产 欧美色综合| 国产99精品国产| 欧美精品电影在线播放| 26uuu精品一区二区在线观看| 欧美国产综合一区二区| 亚洲福利一区二区| 成人av资源在线观看| 91麻豆精品国产无毒不卡在线观看 | 久久久噜噜噜久久人人看 | 成人一区在线观看| 欧美大片拔萝卜| 亚洲成人一二三| 国产精品一区二区三区99| 在线观看91精品国产入口| 亚洲精品在线电影| 久久草av在线| 精品久久久久一区二区国产| 亚洲1区2区3区视频| 91女厕偷拍女厕偷拍高清| 欧美日韩黄视频| 精品av久久707| 日韩在线卡一卡二| 欧洲生活片亚洲生活在线观看| 精品国产伦一区二区三区免费 | 成人网页在线观看| 精品国产乱码久久久久久久久| 亚洲电影激情视频网站| 欧美曰成人黄网| 一区二区三区不卡在线观看| 91网址在线看| 五月婷婷另类国产| 欧美三级一区二区| 日韩精品一级二级 | 日韩欧美一级二级| 日产欧产美韩系列久久99| 欧美一区二区成人6969| 国产成人精品免费| 日韩久久久久久| 国产v日产∨综合v精品视频| 国产精品久久午夜| 亚洲福利一区二区三区| 日韩中文字幕91|