QT環境下,全局變量共享問題

開始的技術路線是:linux

 首先有兩個主線程:api

  1,gui線程數組

  2,等待客戶端socket鏈接用的,listen線程服務器

  (當有客戶端鏈接時,即creat一個新的線程2用來跟客戶端通訊,再來新的客戶端,繼續creat新的work線程3用於通訊,以此類推,目前最多能夠creat5個線程,便可以同時跟5臺客戶端通訊,設置了監聽的socket服務器最多監聽5個隊列。線程2繼續listen)多線程

 

出現的問題是:socket

  用來通訊的work線程3,收到一個來自客戶端的xml文件,而後解析文件,並將其數據放在一個全局的靜態struct數組裏。數據正常,線程2和線程3都可以看到已經更新的數據值。可是,函數

  當gui線程去訪問時,發現數據並無更新到其線程,在gui線程下改變該全局變量的數值,也並無更新到線程2和3,不知何解?ui

 

一博主,有如此解釋spa

其實在Linux 中,新建的線程並非在原先的進程中,而是系統經過一個系統調用clone() 。該系統copy 了一個和原先進程徹底同樣的進程,並在這個進程中執行線程函數。不過這個copy 過程和fork 不同。copy 後的進程和原先的進程共享了全部的變量,運行環境(clone的實現是能夠指定新進程與老進程之間的共享關係,100%共享就表示建立了一個線程)。這樣,原先進程中的變量變更在copy 後的進程中便能體現出來。
 
 不過,問題並無清晰化。
 
想到的解決方案暫時有兩種:
  1,不在work線程裏面解析數據,直接在gui線程裏面解析數據。
   2,採用 線程私有數據
 

(此處出現過,小插曲:QT的變量查看器,在調試時不太穩定,更新事後的值在窗口中查看,並無獲得及時更新,須要經過程序斷定驗證!).net

 

另外的問題是:一個變量在多線程環境下,它們的地址都是不一樣的,爲何呢?待解! 

 

因爲程序須要在線程建立以後必須返回到gui主線程,因此採用建立兩次線程的方式:建立線程A,返回,而後在線程A裏面建立

在多線程POSIX標準下,主線程(1),便是GUI線程。它初始化一個類,並調用其一個成員函數建立一個線程3(ininlistenThred)【不知,爲何不從2開始?】,而後在線程3裏面一直循環檢測是否有新的客戶端發來socket鏈接。當有新的客戶端鏈接上時,即建立一個新的線程專門用於socket通訊。

此時有一客戶端鏈接上,建立了通訊工做線程4(listenthreadwork)。

 

輸出g_buf[0].carid的代碼位置分別爲:

1,initlistenthread線程在進入循環入口 即打印出:

for( ; ; )
{

    qDebug("listenthread g_buf[0].carid: %s ",g_buf[0].carid);

    char *t = &(g_buf[0].carid[0]);

  qDebug("dizhi: %d \n\n",&t);
//......
}

2,gui主線程在點擊按鈕的時候,即打印:

qDebug("mainwindow g_buf[0].carid: %s",g_buf[0].carid);
char *t = &(g_buf[0].carid[0]);
qDebug("dizhi: %d \n\n",&t);

3,listenthreadwork線程在循環工做的時候開始就打印信息:(一進去此線程就會先打印一次值,而後每次收到文件就會打印一次)

for( ; ; )
    {
        qDebug("listenthreadwork g_buf[0].carid: %s",g_buf[0].carid);
        char *t = &(g_buf[0].carid[0]);
        qDebug("dizhi: %d \n\n",&t);
//.........
}

 

  • 線程3和4的值同樣的!
  • 線程1跟另外兩個線程是不一樣的值!
  •  跟類不要緊的兩個線程值同樣

 

 

相關文章
相關標籤/搜索