系統(tǒng)之家 - 系統(tǒng)光盤下載網(wǎng)站!

當(dāng)前位置:系統(tǒng)之家 > 系統(tǒng)教程 > 線程間通信及同步方法介紹

線程間通信及同步方法介紹

時(shí)間:2017-10-26 15:37:15 作者:chunhua 來(lái)源:系統(tǒng)之家 1. 掃描二維碼隨時(shí)看資訊 2. 請(qǐng)使用手機(jī)瀏覽器訪問: https://m.xitongzhijia.net/xtjc/20171026/110108.html 手機(jī)查看 評(píng)論

  線程間如何通信/同步?此前小編給大家介紹了進(jìn)程間通信的方法,于是一些伙伴又好奇線程間的通信及同步方法,沒關(guān)系,下面小編就繼續(xù)給大家科普下線程間通信及同步的方法。

線程間通信及同步方法介紹

線程間通信及同步方法介紹:

  一、線程間的通信方式

  1、使用全局變量

  主要由于多個(gè)線程可能更改全局變量,因此全局變量最好聲明為volatile。

  2、使用消息實(shí)現(xiàn)通信

  在Windows程序設(shè)計(jì)中,每一個(gè)線程都可以擁有自己的消息隊(duì)列(UI線程默認(rèn)自帶消息隊(duì)列和消息循環(huán),工作線程需要手動(dòng)實(shí)現(xiàn)消息循環(huán)),因此可以采用消息進(jìn)行線程間通信sendMessage,postMessage。

  1)定義消息#define WM_THREAD_SENDMSG=WM_USER+20;

  2)添加消息函數(shù)聲明afx_msg int OnTSendmsg();

  3)添加消息映射ON_MESSAGE(WM_THREAD_SENDMSG,OnTSM);

  4)添加OnTSM()的實(shí)現(xiàn)函數(shù);

  5)在線程函數(shù)中添加PostMessage消息Post函數(shù)。

  3、使用事件CEvent類實(shí)現(xiàn)線程間通信

  Event對(duì)象有兩種狀態(tài):有信號(hào)和無(wú)信號(hào),線程可以監(jiān)視處于有信號(hào)狀態(tài)的事件,以便在適當(dāng)?shù)臅r(shí)候執(zhí)行對(duì)事件的操作。

  1)創(chuàng)建一個(gè)CEvent類的對(duì)象:CEvent threadStart;它默認(rèn)處在未通信狀態(tài);

  2)threadStart.SetEvent();使其處于通信狀態(tài);

  3)調(diào)用WaitForSingleObject()來(lái)監(jiān)視CEvent對(duì)象。

  二、線程間的同步方式

  各個(gè)線程可以訪問進(jìn)程中的公共變量,資源,所以使用多線程的過程中需要注意的問題是如何防止兩個(gè)或兩個(gè)以上的線程同時(shí)訪問同一個(gè)數(shù)據(jù),以免破壞數(shù)據(jù)的完整性。

  數(shù)據(jù)之間的相互制約包括:

  1、直接制約關(guān)系,即一個(gè)線程的處理結(jié)果,為另一個(gè)線程的輸入,因此線程之間直接制約著,這種關(guān)系可以稱之為同步關(guān)系。

  2、間接制約關(guān)系,即兩個(gè)線程需要訪問同一資源,該資源在同一時(shí)刻只能被一個(gè)線程訪問,這種關(guān)系稱之為線程間對(duì)資源的互斥訪問,某種意義上說互斥是一種制約關(guān)系更小的同步。

  線程間的同步方式有四種:

  1、臨界區(qū)

  臨界區(qū)對(duì)應(yīng)著一個(gè)CcriticalSection對(duì)象,當(dāng)線程需要訪問保護(hù)數(shù)據(jù)時(shí),調(diào)用EnterCriticalSection函數(shù);當(dāng)對(duì)保護(hù)數(shù)據(jù)的操作完成之后,調(diào)用LeaveCriticalSection函數(shù)釋放對(duì)臨界區(qū)對(duì)象的擁有權(quán),以使另一個(gè)線程可以?shī)Z取臨界區(qū)對(duì)象并訪問受保護(hù)的數(shù)據(jù)。

  PS:關(guān)鍵段對(duì)象會(huì)記錄擁有該對(duì)象的線程句柄即其具有“線程所有權(quán)”概念,即進(jìn)入代碼段的線程在leave之前,可以重復(fù)進(jìn)入關(guān)鍵代碼區(qū)域。所以關(guān)鍵段可以用于線程間的互斥,但不可以用于同步(同步需要在一個(gè)線程進(jìn)入,在另一個(gè)線程leave)。

  2、互斥量

  互斥與臨界區(qū)很相似,但是使用時(shí)相對(duì)復(fù)雜一些(互斥量為內(nèi)核對(duì)象),不僅可以在同一應(yīng)用程序的線程間實(shí)現(xiàn)同步,還可以在不同的進(jìn)程間實(shí)現(xiàn)同步,從而實(shí)現(xiàn)資源的安全共享。

  PS:

  1)互斥量由于也有線程所有權(quán)的概念,故也只能進(jìn)行線程間的資源互斥訪問,不能由于線程同步;

  2)由于互斥量是內(nèi)核對(duì)象,因此其可以進(jìn)行進(jìn)程間通信,同時(shí)還具有一個(gè)很好的特性,就是在進(jìn)程間通信時(shí)完美的解決了“遺棄”問題。

  3、信號(hào)量

  信號(hào)量的用法和互斥的用法很相似,不同的是它可以同一時(shí)刻允許多個(gè)線程訪問同一個(gè)資源,PV操作。

  PS:事件可以完美解決線程間的同步問題,同時(shí)信號(hào)量也屬于內(nèi)核對(duì)象,可用于進(jìn)程間的通信。

  4、事件

  事件分為手動(dòng)置位事件和自動(dòng)置位事件。事件Event內(nèi)部它包含一個(gè)使用計(jì)數(shù)(所有內(nèi)核對(duì)象都有),一個(gè)布爾值表示是手動(dòng)置位事件還是自動(dòng)置位事件,另一個(gè)布爾值用來(lái)表示事件有無(wú)觸發(fā)。由SetEvent()來(lái)觸發(fā),由ResetEvent()來(lái)設(shè)成未觸發(fā)。

  PS:事件是內(nèi)核對(duì)象,可以解決線程間同步問題,因此也能解決互斥問題。

  關(guān)于線程間的通信及同步方法就給大家講解到這里了,更多關(guān)于線程同步的文章,大家可以參考:《線程同步的方法有哪些?Linux下實(shí)現(xiàn)線程同步的三種方法》

發(fā)表評(píng)論

0

沒有更多評(píng)論了

評(píng)論就這些咯,讓大家也知道你的獨(dú)特見解

立即評(píng)論

以上留言僅代表用戶個(gè)人觀點(diǎn),不代表系統(tǒng)之家立場(chǎng)

其他版本軟件

人氣教程排行

相關(guān)系統(tǒng)推薦

官方交流群 軟件收錄