進程及線程通信總結

上文我們介紹了如何建立一個簡單的多線程程序,多線程之間不可避免的需要進行通信 。相比于進程間通信來說,線程間通信無疑是相對比較簡單的

??? 首先我們來看看最簡單的方法,那就是使用全局變量(靜態變量也可以)來進行通信由于屬于同一個進程的各個線程是處于同一個進程空間中的,并且它們共享這個進程的各種資源,因此它們都可以毫無障礙的訪問這個進程中的全局變量。當需要有多個線程來訪問一個全局變量時,通常我們會在這個全局變量前加上volatile聲明,來告訴編譯器這個全局變量是易變的,讓編譯器不要對這個變量進行優化(至于編譯器到底有沒有按照你的要求來對volatile進行處理這個暫且不理)。

??? 下面貼出一段簡單的示例代碼:

#include?"stdafx.h"
#include?
"windows.h"
#include?
"stdio.h"

volatile?int?ThreadData?=?0;

void?ThreadProcess()
{
????
for(int?i=0;?i<6;?i++)
????
{
????????ThreadData?
+=?1000;
????????Sleep(
1000);
????????printf(
"Sub??Thread?Tick?%5d!?%5d\n",(i+1)*1000,?ThreadData);
????}

????printf(
"Exit?Sub?Thread!\n");
????
}


int?_tmain(int?argc,?_TCHAR*?argv[])
{
????HANDLE?hThread;
????DWORD?ThreadID;
????hThread
=CreateThread(NULL,
?????????????????????
0,
?????????????????????(LPTHREAD_START_ROUTINE)ThreadProcess,
?????????????????????NULL,
?????????????????????
0,
?????????????????????
&ThreadID);
????
????
for(int?i=0;?i<10;?i++)
????
{
????????ThreadData?
-=?600;
????????Sleep(
600);
????????printf(
"Main?Thread?Tick?%5d!?%5d\n",?(i+1)*600,?ThreadData);
????}

????printf(
"Main?Thread?Loop?Finished!?\n");
????system(
"pause");
????
return?0;
}

?

?

??? 除了全局變量之外,還有其他的方法,比如利用消息機制等來實現線程間通信。

?

線程間無需特別的手段進行通信,因為線程間可以共享數據結構,也就是一個全局變量可以被兩個線程同時使用。不過要注意的是線程間需要做好同步,一般用mutex

?

一、互斥與同步
1.互斥:是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。

2.同步:是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源.

3.同步是一種更為復雜的互斥,而互斥是一種特殊的同步.

二、通信與同步
進程間同步本身也是一種進程間通信(因為涉及信息的交換),當然也是一種原始的進程間通信,但同時又是更高級的進程間通信機制的基石。
對線程亦然.

三、臨界區(Critical section)與互斥體(Mutex)的區別

1、臨界區只能用于對象在同一進程里線程間的互斥訪問;互斥體可以用于對象進程間或線程間的互斥訪問。
2、臨界區是非內核對象,只在用戶態進行鎖操作,速度快;互斥體是內核對象,在核心態進行鎖操作,速度慢。
3、臨界區和互斥體在Windows平臺都下可用;Linux下只有互斥體可用。

四、linux IPC
1.經典IPC:
(1)管道、命名管道?????? //最基本最常用

(2)消息隊列、信號量、共享存儲
//分為Posix IPC和System V IPC,共享存儲是運行在同一臺機器上的進程間通信最快的方式

2高級IPC: 流管道、命名流管道
(以上是限于同一臺主機的各個進程間的IPC)

3.支持不同主機上各個進程的IPC:套接口、流

五、線程間通信機制:
1.互斥鎖
2.條件變量
3.讀寫鎖
4.信號燈


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253898.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253898.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253898.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ROS multi-master——multimaster_fkie配置

多主站ROS配置和mutimaster_fkie ROS版本&#xff1a;kinetic 操作系統&#xff1a;Ubuntu 16.04。 multimaster_fkie&#xff1a;github 1網絡配置 1.1路由器 設置無線路由器并連接兩臺計算機/機器人。為這兩臺計算機設置靜態IP地址。相互測試ping命令和ssh。 1.2主機 …

Docker入門

1. Docker簡介: docker是一個基于LXC的高級容器引擎。簡單地說&#xff0c;docker是一個輕量級的虛擬解決方案&#xff0c;或者說它是一個超輕量級的虛擬機&#xff08;容器&#xff09;。 Docker是一個開源的引擎&#xff0c;可以輕松的為任何應用創建一個輕量級的、可移植的、…

樂器庫的混合

每臺微機一個聲卡&#xff0c;也就是一片D/A&#xff0c;驅動按波特率、采樣位數、采樣通道傳輸給D/A&#xff0c;輸出模擬音頻。播放時僅一種與硬件支持格式對應&#xff0c;其他需驅動&#xff08;有損&#xff09;變換到硬件支持格式。每個應用都可單獨播放聲音&#xff0c;…

kafka認知--(1)

文檔參考&#xff1a;http://kafka.apache.org/documentation.html 下載代碼&#xff1a; tar -xzf kafka_2.11-0.11.0.0.tgz cd kafka_2.11-0.11.0.0 啟動 bin/zookeeper-server-start.sh config/zookeeper.properties 創建topic&#xff08;主題為test&#xff0c;只有一個分…

帶頭尾指針的list的C實現

一、緣起 很早寫了一個帶頭尾指針的list&#xff0c;該list支持從尾部插入元素&#xff0c;在任意位置刪除元素&#xff0c;最近用這個list時發現一個bug&#xff0c;修正了&#xff0c;并加了幾個接口函數。貼出來&#xff0c;希望對C的初學者有用。 二、基本說明 2.1、數據結…

Gmapping——從原理到實踐

概述 在SLAM中&#xff0c;機器人位姿和地圖都是狀態變量&#xff0c;我們需要同時對這兩個狀態變量進行估計&#xff0c;即機器人獲得一張環境地圖的同時確定自己相對于該地圖的位置。我們用x表示機器人狀態&#xff0c;m表示環境地圖&#xff0c;z表示傳感器觀測情況&#xf…

關于git分支

1.關于git分支 git的“分支”乍一聽是一個特別容易讓人產生錯覺的概念&#xff0c;以為它和樹枝一樣是分叉的枝節&#xff0c;其實Git中的分支本質上是個指向commit對象的指針,每次commit&#xff0c;git都把它們串成一條時間線&#xff0c;這條時間線就是一個分支。 2.直接切換…

【機器學習經典算法源碼分析系列】-- 邏輯回歸

1.邏輯回歸&#xff08;Logistic Regression&#xff09;又常被成為“邏輯斯蒂回歸”&#xff0c;實質上是一個二元分類問題。 邏輯回歸代價函數&#xff1a; 代價函數導數&#xff1a; Matlab實現&#xff1a; 采用matlab中自帶的無約束最小化函數fminunc來代替梯度下降法&…

求特殊自然數

總時間限制: 1000ms 內存限制: 65536kB 描述一個十進制自然數,它的七進制與九進制表示都是三位數&#xff0c;且七進制與九進制的三位數碼表示順序正好相反。編程求此自然數,并輸出顯示。 輸入無。輸出三行&#xff1a;第一行是此自然數的十進制表示&#xff1b;第一行是此自然…

ROS——不同版本間ROS進行通信

在相同版本間的ROS進行通信不在贅述了&#xff0c;修改/etc/hosts文件即可。 最近項目遇到在Ubuntu16.04 與Ubuntu18.04兩個系統間進行ROS通信&#xff0c;ROS版本分別為Kinetic和Melodic。配置網絡后&#xff0c;兩邊都能夠ping通&#xff0c;但是在獲取ros數據是&#xff0c…

大數據開發實戰:數據流圖及相關數據技術

1、大數據流程圖 2、大數據各個環節主要技術 2.1、數據處理主要技術 Sqoop&#xff1a;&#xff08;發音&#xff1a;skup&#xff09;作為一款開源的離線數據傳輸工具&#xff0c;主要用于Hadoop(Hive) 與傳統數據庫&#xff08;MySql,PostgreSQL&#xff09;間的數據傳遞。它…

oracle 中時間類型 date 與 long 互轉

我們在保存時間到數據庫時&#xff0c;有時候會保存long型的數據&#xff0c;固定長度是13位&#xff0c;是用當前時間減去1970-01-01&#xff0c;再換算成毫秒得到的結果。 但是要考慮到時區問題中國的時區時8區所以時間要加上8小時 oracle中的實現方式&#xff1a; ---------…

Linux對包管理闡述

Centos/Redhat/Fedora的軟件包&#xff0c;都是rpm后綴的文件。包管理器rpm(Redhat packages manager) linux的哲學思想是簡單命令解決復雜任務&#xff0c;因此每個軟件的功能較單一&#xff0c;所以各種包之間有著復雜的依賴關系&#xff0c;為了解決這種可以使用前端工具&am…

跨時鐘域電路設計——亞穩態及雙鎖存器

一、同步電路 定義&#xff1a;電路中所有受時鐘控制的單元&#xff0c;全部由一個統一的時鐘控制。 優點&#xff1a;在同步設計中&#xff0c;EDA工具可以保證電路系統的時序收斂&#xff0c;避免電路設計中的競爭冒險。 缺點&#xff1a;時鐘樹綜合需要加入大量延遲單元&…

linux setsockopt詳解

1.closesocket&#xff08;一般不會立即關閉而經歷TIME_WAIT的過程&#xff09;后想繼續重用該socket&#xff1a; BOOL bReuseaddrTRUE; setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL)); 2. 如果要已經處于連接狀態的soket在調用closes…

[TOOLS] 移動端調試進行時 - whistle

1、本地安裝、啟動whistle 安裝實操請查看官方文檔不贅述 復制代碼 2、手機設置代理 實操請查看官方文檔 !!!注意&#xff1a;代理ip填寫whistle右上角online選項中的ip 復制代碼 3、whistle上設置對應rules、weinre whistle設置代理(!!!注意支持tunnel協議)&#xff1a; rules…

函數動態參數實現format

變量賦值一種是字符串格式化&#xff0c;一種是通過format的方式 1.字符串格式化 s"i am %s,age %d"%(Jasper,23)print(s)打印輸出&#xff1a;i am Jasper,age 232.format格式化 s"i am {name},age {age}".format(namejasper,age23)print(s)或 s2"i …

跨時鐘域電路設計——單bit信號

前面提到了簡單的雙電平鎖存器&#xff0c;下面是一些單bit同步電路。 一、慢時鐘域向快時鐘域 邊沿檢測同步器 將慢時鐘域的脈沖搬移并縮小為快時鐘域的脈沖。 既可以檢測上升沿&#xff0c;也可以檢測下降沿。 如上圖&#xff0c;慢時鐘下一個有效脈沖的最短周期為慢時鐘的…

數據同步 rsync+notify架構

rsync 同步命令&#xff0c;非常好用 notify是監控本地文件的變化的 、安裝配置 1. 安裝rsync&#xff0c;inotify-tools sudo apt-get install rsync inotify-tools 2. 拷貝rsync配置文件 mkdir /etc/rsync cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/rsync/ 3. 服…

OC_KVC與KVO簡單介紹

KVC KVC概述 KVC 即 Key-value coding 鍵值編碼&#xff0c;是指iOS的開發中&#xff0c;可以允許開發者通過Key名直接訪問對象的屬性&#xff0c;或者給對象的屬性賦值。 KVC案例 interface Person : NSObjectproperty (nonatomic,assign) int age; property (nonatomic,copy)…