1. 程式人生 > >pthreads v3下一些坑和需要注意的地方

pthreads v3下一些坑和需要注意的地方

一、子執行緒無法訪問父執行緒的全域性變數,但父執行緒可以訪問子執行緒的變數

<?php

class Task extends Thread
{
    public $data;

    public function run()
    {
        global $num;
        var_dump($num);
        $this->data = 'abc';

        //這是列印null
        var_dump($GLOBALS);
        $GLOBALS['test'] = 'def';
    }
}

//主執行緒中的全域性變數,子執行緒中是無法訪問的
//php中建立子執行緒,它會有一個單獨的堆,執行在單獨的地址空間中
//並不能像有些語言中,子執行緒是可以訪問的到主執行緒中的變數的。
$num = 666;

$GLOBALS['test'] = 'test';

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

//主執行緒可以訪問子執行緒的變數
var_dump($t->data);

結果如下:

二、子執行緒無法修改父執行緒的變數

<?php

class Task extends Thread
{
    private $data;

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

    public function run()
    {
        echo "task data : ", $this->data, "\n";
        $this->data = 'def';
        echo "task data : ", $this->data, "\n";
    }
}

$data = 'abc';

//我們這裡傳入的是引用
$t = new Task($data);
$t->start() && $t->join();

//但是$data變數資料並沒改變
//這說明我們通過建構函式傳入Task物件中的$data只是一個拷貝
//子執行緒中並不能夠操作主執行緒中的變數
var_dump($data);

結果如下:

三、pthreads v3版本可以設定成員為匿名函式

<?php

class Task extends Thread
{
    private $call;


    public function __construct()
    {
        //pthreads v3版本好像可以設定成員為匿名函式
        //在v2版本中好像是不可以的
        $this->call = function ($param1, $param2) {
            echo "task call param1 : {$param1} param2 : {$param2}\n";
        };
    }

    public function run()
    {
        //直接呼叫成員匿名函式
        ($this->call)("hello", "world");
    }
}

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

結果如下:

四、對於資料庫連線資源,我們需要宣告為靜態成員

<?php

class Task extends Thread
{
    private $db;

    public function __construct()
    {
        //注意這裡會報錯,不能對PDO例項進行序列化或反序列化
        $this->db = new PDO('mysql:dbname=test;host=192.168.33.226', 'root', '');
    }

    public function run()
    {
        $result = $this->db->query("select id,name from tb_user");
        while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
            echo "{$row['id']}\t{$row['name']}\n";
        }
    }
}

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

結果如下:

程式碼修改如下:

<?php

class Task extends Thread
{
    //我們需要把資料庫連線資源,宣告為靜態成員,然後呼叫靜態方法進行建立
    private static $db;

    //我們直接在__construct()建構函式裡對$db進行例項化,好像會是null,有興趣的可以試試
    public static function getConn()
    {
        if (!is_resource(self::$db)) {
            self::$db = new PDO('mysql:dbname=test;host=192.168.33.226', 'root', '');
        }
        return self::$db;
    }

    public function run()
    {
        $result = self::getConn()->query("select id,name from tb_user");
        while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
            echo "{$row['id']}\t{$row['name']}\n";
        }
    }
}

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

結果如下:

最後說明,不排除pthreads以後的版本升級上面的有些問題不會出現。

我的php版本是7.2.4,pthreads的版本是3.1.7dev

相關推薦

pthreads v3一些需要注意地方

一、子執行緒無法訪問父執行緒的全域性變數,但父執行緒可以訪問子執行緒的變數 <?php class Task extends Thread { public $data; public function run() { global $n

pthreads v3的workerpool的使用

有些人會想,明明用thread已經可以很好的工作了,為什麼還要搞個worker和pool? 之所以要用到worker和pool還是因為效率,因為系統建立一個新執行緒代價是比較昂貴,每個建立的執行緒會複製當前執行的整個上下文。 儘可能的重用執行緒可以讓我們的程式更高效。 一個簡單的worker例子:

Mysql分割槽表使用的一些限制需要注意地方

mysql分割槽策略都基於兩個非常重要的假設:查詢都能夠過濾(prunning)掉很多額外的分割槽、分割槽本身並不會帶來很多額外的代價。而事實證明,這兩個假設在某些場景下會有問題。下面介紹一些可能會遇到的問題。 NULL位會使分割槽過濾無效   關於分割槽表一個容易讓人

【高併發】高併發環境構建快取服務需要注意哪些問題?我阿里P9聊了很久!

## 寫在前面 > 週末,跟阿里的一個朋友(去年晉升為P9了)聊了很久,聊的內容幾乎全是技術,當然了,兩個技術男聊得最多的話題當然就是技術了。從基礎到架構,從演算法到AI,無所不談。中間又穿插著不少天馬行空的想象,雖然現在看起來不太實際,但是隨著技術的進步,相信五年、十年之後都會實現的。 > &

VM ware 安裝時候的一些解決辦法

1.解決VMware Workstation 不可恢復錯誤: (vcpu-0)  開機進入bios,開啟inter virtual technology   enable     2.進入之後輸入密碼不顯示的,但是是有輸入的   &nb

python無法連線mysql,有個小需要注意一下!

嘗試用python連結mysql資料庫,按照教程裡連結了小半夜,就是沒有連結上,找了各種文章,最後發現是版本的問題,我想使用的模組是MySQLdb,剛剛去他們的官網看了一下,最近一次更新是2014年,也就是說不支援python3.0以上版本。 同樣採坑的小夥伴們要注意了!!!!!!!! 解決辦法: 來源

Xpath使用例項需要注意的事項

Xpath使用例項和需要注意的事項 Xpath的語法介紹就不贅述了,參考:https://blog.csdn.net/u011486491/article/details/84061432 這篇文章就以實際使用為例,對一些xpath比較複雜的情況進行討論使用。 常用的標籤提取欄位

走向前端,填異常

1. NPM 命令執行 報錯 D:\webworkspace\WebpackDemo>npm -v module.js:327 throw err; ^ Error: Ca

Git 學習過程中遇到的一些自己的一些理解

Git 在向遠端倉庫提交時出錯 我們看到的很多的git教程中都會先教你如何新建github倉庫,但是這裡有一個坑,就是,新建倉庫時勾選了Initialize this repository with a README,即為倉庫初始化一個README.md檔案,但是如果這樣的

最近使用gvoice的小隊語音 一些感悟《一》

騰訊語音外掛gvoice,基於unity 至於匯入外掛什麼的就不多說,多的是教程,但是詳細的使用教程少的可憐,也是踩了好多坑,才算除錯通. 新建一個語音模組管理器 GVoiceManager,做成單例方便呼叫 public static GVoiceManager _Instan

Tomcat使用Spring + JPA 需要注意的問題

Tomcat預設的類載入器不支援類轉換,所以需要使用自定義的類載入器,具體操作步驟如下: 1.在LocalContainerEntityManagerFactoryBean中,設定loadTimeWeaver屬性 <bean id="entityManagerFa

pthreads v3的同步處理synchronized

之所以會用到同步,是因為如果多個執行緒中對同一個資源進行操作時,會發生混亂。 比如2個執行緒對變數進行加1操作,第1個執行緒還沒來的及改寫資料時,第2個執行緒就對變數進行操作了,那變數最終的結果就是未知的,這個時候就需要同步來進行控制了。 例子如下: <?php class Count

pthreads v3的Volatile介紹與使用

由於pthreads v3中引入了Threaded物件自動不變性的概念,所以當我們在建構函式中給成員設定為陣列時,在其他地方就無法對成員再次改寫了。 例子如下: <?php //pthreads v3引入了Threaded物件自動不變性的概念 //如果成員被設定成Threaded物件,那

使用vue2+Vuex+Router寫的Demo以及遇到的一些使用建議

一直對vue很感興趣,最近使用vue2.0開發了高仿餓了麼點餐系統來練練手,不得不說vue真是一個很不錯的框架,但是也遇到過一些坑,在這裡和大家分享一下 餓了麼點餐系統 vue2.0、vuex、vue-router、axios、webpac

網頁中QQ線上客服進行聊天的一些解決方案

說明 從瀏覽器喚起QQ進行聊天,是很多公司或者企業會用到的一種客服方式,然而很多時候,一些手機端瀏覽器並不支援直接跳轉到QQ,或者不支援從App內嵌的網頁中跳轉到QQ頁面。 正文 針對跳轉喚起QQ,QQ推廣的官方網站http://shang.qq.com/v3/i

記錄串列埠使用需要注意地方

1.串列埠使用有時候讀取不了串列埠。不要一直去檢查驅動問題,偶爾看看你的板子上面是否有一個小開關,把串列埠功能關閉了。 2.另外,當串口占用之時,採用USB轉TTL型別的下載器就下載不了程式了。因為串列埠已經佔用了TX和Rx引腳,那麼當然下載器下載不了程式了。

hashCode equals 正確用法需要注意地方(面試基本都會問)

文章來源: 文章目錄: 1、hashCode()和equals()的用法 2、重寫預設實現 3、使用Apache Commons Lang包重寫hashCode()和equals() 4、需要注意記住的事情 5、當使用ORM的時候特別要注意的 has

asp.net core系列 76 Apollo 快速安裝模式ASP.NetCore結合使用

前言:由於公司佔時沒有運維,出於微服務的需要,Apollo只能先裝在windows 阿里雲上跑起來,由於環境及網路等問題,在安裝過程中遇到很多坑,算是一個個坑填完後,最終實現。   一. java jdk環境   java jdk 1.8下載地址: https://www.oracle.c

關於內購支付的流程一些需要注意

網路上關於內購支付的文章大都千篇一律,講述的是如何建立內購專案,最後再把內購發起的相關程式碼直接寫上就完事了。但是,在實際開發中,關於內購的坑卻多的讓人抓狂,比如常見的掉單,重複充值等情形。有的使用者反饋我明明釦過錢了,為何沒有充值?有的卻是使用者付了一次款,卻給衝了兩次+的額度,無論哪種情況,對開發者

使用python時需要注意的點

最近使用Python的過程中遇到了一些坑,例如用datetime.datetime.now()這個可變物件作為函式的預設引數,模組迴圈依賴等等。 在此記錄一下,方便以後查詢和補充。 避免可變物件作為預設引數 在使用函式的過程中,經常會涉及預設引數。在Python中,當使用可變物件作為預設