日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

进程及线程通信总结

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程及线程通信总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上文我們介紹了如何建立一個簡單的多線程程序,多線程之間不可避免的需要進行通信 。相比于進程間通信來說,線程間通信無疑是相對比較簡單的

??? 首先我們來看看最簡單的方法,那就是使用全局變量(靜態變量也可以)來進行通信由于屬于同一個進程的各個線程是處于同一個進程空間中的,并且它們共享這個進程的各種資源,因此它們都可以毫無障礙的訪問這個進程中的全局變量。當需要有多個線程來訪問一個全局變量時,通常我們會在這個全局變量前加上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.信號燈


總結

以上是生活随笔為你收集整理的进程及线程通信总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。