首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

線程間通信?其實是共享內存:進程vs線程數據隔離對比實驗

     編輯:關於C語言

線程間通信?其實是共享內存:進程vs線程數據隔離對比實驗

嚴格說來,同一進程內的線程不需要通信機制,因為它們天然共享進程地址空間(全局變量、堆、代碼、打開的文件描述符)。本文通過一個對比實驗,直觀展示進程隔離與線程共享的本質差異。

一、實驗設計

  • 定義全局變量 int data = 1 作為共享資源。
  • 父進程修改為 2,創建子進程(fork)。
  • 子進程修改為 3。
  • 父進程等待子進程結束,創建兩個線程。
  • 線程1修改為 4,線程2修改為 5。
  • 每步打印修改前後的值與PID/TID。

二、運行結果還原

PID: 4394 -> Father Process running
old data=1, new data=2          // 父進程修改 1→2

PID: 4395 -> Son Process running
old data=1, new data=3          // 子進程看到初始值1,修改 1→3(獨立副本!)

Son process finished: PID=4395

Create first thread by 4394
TID: 3075603264
old data=2, new data=4          // 線程1看到父進程修改後的值2,修改 2→4

Create second thread by 4394
TID: 3075603264
old data=4, new data=5          // 線程2看到線程1修改後的值4,修改 4→5

三、核心現象解析

場景數據可見性原因
父進程 → 子進程不可見fork 復制地址空間(Copy-on-Write),子進程擁有獨立 data 副本
子進程 → 父進程不可見同理,修改各自副本
父進程 → 線程1可見線程共享父進程地址空間,直接訪問同一 data
線程1 → 線程2可見同一地址空間,線程1寫入,線程2立即讀到新值

四、本質區別:進程隔離 vs 線程共享

進程

  • 獨立地址空間(頁表隔離)。
  • 資源獨立:文件表、信號處理、當前目錄、用戶ID等。
  • 通信必須通過內核:管道、Socket、共享內存、消息隊列、信號。
  • 開銷大:上下文切換涉及頁表切換、TLB刷新、內核態進出。

線程

  • 共享地址空間(同一頁表)。
  • 共享:全局/靜態變量、堆內存、代碼段、文件描述符表。
  • 私有:棧、寄存器上下文、線程ID、errno、信號屏蔽字、優先級。
  • 通信無需內核:直接讀寫共享變量(但需同步:鎖、原子操作)。
  • 開銷小:切換僅保存/恢復寄存器、棧指針、TLS。

五、線程「通信」的實質:共享內存 + 同步

線程間傳遞數據的模式:

  1. 共享變量:全局、靜態、堆分配、主線程傳遞指針給線程。
  2. 同步原語:互斥量保護臨界區、條件變量等待條件、信號量控制流程、原子操作無鎖編程。
  3. 線程局部存儲 (TLS):pthread_key_create/pthread_setspecific 實現線程私有全局變量。

六、進程間通信 (IPC) 回顧

因進程隔離,必須借助內核:

  • 管道/命名管道:半雙工/全雙工字節流,父子/無親緣進程。
  • Socket:網絡/本地通信,跨機器/跨進程通用。
  • 共享內存:shmget/mmap 映射同一物理頁,**最快IPC**,但需自行同步(信號量/互斥量置於共享區)。
  • 消息隊列:內核緩衝消息結構體,帶類型/優先級。
  • 信號:異步通知,sigaction 可傳遞 sigval (Linux實時信號)。

七、設計啟示

  1. 能用線程別用進程:同機器、高頻交互、共享大數據結構 → 線程+鎖/原子操作。
  2. 必須隔離時用進程:安全沙箱、故障隔離、不同用戶權限、跨語言模塊、穩定性要求極高(瀏覽器多進程架構)。
  3. 混合架構:主進程管理多工作進程,進程內用線程池(Nginx、Redis、Chrome、数据库)。
  4. 共享即同步:線程共享變量**必須**加鎖或用原子操作,否則數據競態導致未定義行為。

這個實驗揭示了並發編程最核心的真相:進程隔離靠內核,線程共享靠硬件(MMU頁表共享)。理解這一點,選擇進程還是線程、設計通信同步方案,就有了堅實的理論基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved