C++中fork()函數(shù)
一、fork函數(shù)核心概念
fork() 是Unix/Linux系統(tǒng)下的系統(tǒng)調(diào)用(C++可通過<unistd.h>頭文件調(diào)用),核心作用是創(chuàng)建一個新進程(子進程),原進程稱為父進程。
關(guān)鍵特性(新手必懂)
- 調(diào)用一次,返回兩次:
fork()調(diào)用后,操作系統(tǒng)會復(fù)制父進程的內(nèi)存空間(代碼、數(shù)據(jù)、堆棧、文件描述符等),形成子進程。因此:- 父進程中,
fork()返回子進程的PID(進程ID,非負(fù)整數(shù)); - 子進程中,
fork()返回0; - 若創(chuàng)建失?。ㄈ缦到y(tǒng)進程數(shù)上限),返回**-1**。
- 父進程中,
- 寫時復(fù)制(Copy-On-Write, COW):現(xiàn)代系統(tǒng)不會立即復(fù)制全部內(nèi)存,而是讓父子進程共享內(nèi)存頁,僅當(dāng)某一方修改數(shù)據(jù)時才復(fù)制對應(yīng)頁面,大幅提升效率。
- 執(zhí)行流分離:父子進程從
fork()的下一行代碼開始并行執(zhí)行,但調(diào)度順序由操作系統(tǒng)決定,無法預(yù)測。
二、基本用法與代碼示例
1. 最簡示例(區(qū)分父子進程)
#include <iostream>
#include <unistd.h> // fork() 頭文件
#include <sys/wait.h> // wait() 頭文件
#include <cstdlib> // exit() 頭文件
int main() {
// 調(diào)用fork創(chuàng)建子進程
pid_t pid = fork();
// 錯誤處理:fork失敗
if (pid == -1) {
std::cerr << "fork failed!" << std::endl;
exit(EXIT_FAILURE);
}
// 子進程分支(pid == 0)
else if (pid == 0) {
std::cout << "子進程:PID = " << getpid()
<< ",父進程PID = " << getppid() << std::endl;
// 子進程執(zhí)行完退出,避免繼續(xù)執(zhí)行后續(xù)代碼
exit(EXIT_SUCCESS);
}
// 父進程分支(pid > 0)
else {
std::cout << "父進程:PID = " << getpid()
<< ",創(chuàng)建的子進程PID = " << pid << std::endl;
// 父進程等待子進程結(jié)束,避免子進程變成“僵尸進程”
wait(NULL);
std::cout << "子進程已退出" << std::endl;
}
return 0;
}2. 代碼解釋
pid_t:專門存儲進程ID的類型(本質(zhì)是整型);getpid():獲取當(dāng)前進程的PID;getppid():獲取當(dāng)前進程的父進程PID;wait(NULL):父進程阻塞等待任意子進程退出,回收子進程資源;exit(EXIT_SUCCESS):子進程顯式退出,保證邏輯清晰。
3. 運行結(jié)果示例
父進程:PID = 1234,創(chuàng)建的子進程PID = 1235
子進程:PID = 1235,父進程PID = 1234
子進程已退出
(注:父子進程輸出順序可能互換,取決于系統(tǒng)調(diào)度。)
三、常見使用場景
- 并發(fā)執(zhí)行任務(wù):父進程處理主邏輯,子進程處理耗時/獨立任務(wù)(如文件讀寫、網(wǎng)絡(luò)請求);
- 守護進程創(chuàng)建:通過兩次
fork()脫離終端,成為后臺守護進程; - 多進程服務(wù)器:父進程監(jiān)聽端口,每接收到一個客戶端連接就
fork()子進程處理該連接。
四、注意事項(新手易踩坑)
- 僵尸進程問題:若父進程不調(diào)用
wait()/waitpid()等待子進程退出,子進程退出后資源無法回收,會變成僵尸進程(可通過ps -ef | grep defunct查看); - 孤兒進程問題:若父進程先于子進程退出,子進程會被
init進程(PID=1)接管,成為孤兒進程(通常無危害); - 資源共享與競爭:父子進程共享文件描述符,但私有內(nèi)存空間;若需通信,需用管道、共享內(nèi)存等IPC機制;
- 信號處理:
fork()后子進程會繼承父進程的信號處理方式,但未處理的信號會被重置。
五、進階示例:循環(huán)創(chuàng)建多個子進程
#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
#include <cstdlib>
int main() {
const int child_num = 3; // 創(chuàng)建3個子進程
for (int i = 0; i < child_num; ++i) {
pid_t pid = fork();
if (pid == -1) {
std::cerr << "fork failed!" << std::endl;
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 子進程:打印自身編號和PID
std::cout << "子進程" << i+1 << ":PID = " << getpid() << std::endl;
exit(EXIT_SUCCESS); // 關(guān)鍵:子進程退出,避免繼續(xù)循環(huán)創(chuàng)建孫進程
}
}
// 父進程:等待所有子進程退出
for (int i = 0; i < child_num; ++i) {
wait(NULL);
}
std::cout << "所有子進程已退出" << std::endl;
return 0;
}總結(jié)
fork()是Unix/Linux下創(chuàng)建子進程的核心系統(tǒng)調(diào)用,調(diào)用一次返回兩次(父進程返回子PID,子進程返回0);- 核心特性包括寫時復(fù)制、執(zhí)行流并行、資源繼承(文件描述符)與私有(內(nèi)存);
- 使用時需注意回收子進程資源(避免僵尸進程)、區(qū)分父子執(zhí)行邏輯、處理進程間通信需求。
一、進程間通信(IPC)核心機制詳解
在fork()創(chuàng)建的父子進程中,由于內(nèi)存空間完全私有(寫時復(fù)制僅延遲復(fù)制,最終仍是獨立空間),需通過專門的IPC機制實現(xiàn)數(shù)據(jù)交互。以下是最常用的管道、共享內(nèi)存,以及補充的其他核心IPC機制:
1. 管道(Pipe)—— 最簡單的單向通信
管道是半雙工(單向)的通信通道,分為匿名管道和命名管道兩類,核心是基于文件描述符的字節(jié)流傳輸。
(1)匿名管道(Pipe)
- 核心特點:僅適用于有親緣關(guān)系的進程(如父子/兄弟進程),隨進程退出自動銷毀,無文件名,僅存在于內(nèi)核中。
- 創(chuàng)建方式:通過
pipe()系統(tǒng)調(diào)用創(chuàng)建,返回兩個文件描述符:fd[0](讀端)、fd[1](寫端)。 - 通信邏輯:
- 父進程調(diào)用
pipe()創(chuàng)建管道; - 父進程
fork()子進程,子進程繼承管道的文件描述符; - 父進程關(guān)閉讀端(或?qū)懚耍?,子進程關(guān)閉寫端(或讀端),形成單向傳輸;
- 數(shù)據(jù)通過
write()寫入管道,read()從管道讀?。ü艿罏榭諘rread()阻塞,滿時write()阻塞)。
- 父進程調(diào)用
- 代碼示例(父子進程管道通信):
#include <iostream>
#include <unistd.h>
#include <cstring>
#include <sys/wait.h>
int main() {
int fd[2];
// 創(chuàng)建匿名管道
if (pipe(fd) == -1) {
perror("pipe failed");
return 1;
}
pid_t pid = fork();
if (pid == -1) {
perror("fork failed");
return 1;
}
if (pid == 0) { // 子進程:讀數(shù)據(jù)
close(fd[1]); // 關(guān)閉寫端
char buf[100];
ssize_t bytes_read = read(fd[0], buf, sizeof(buf)-1);
if (bytes_read > 0) {
buf[bytes_read] = '\0';
std::cout << "子進程讀取到:" << buf << std::endl;
}
close(fd[0]); // 讀完關(guān)閉讀端
return 0;
} else { // 父進程:寫數(shù)據(jù)
close(fd[0]); // 關(guān)閉讀端
const char* msg = "Hello from parent process!";
write(fd[1], msg, strlen(msg));
close(fd[1]); // 寫完關(guān)閉寫端
wait(NULL); // 等待子進程
std::cout << "父進程完成通信" << std::endl;
}
return 0;
}- 適用場景:父子進程間簡單的單向數(shù)據(jù)傳輸(如父進程給子進程傳遞配置、子進程給父進程返回結(jié)果)。
(2)命名管道(FIFO)
- 核心特點:適用于無親緣關(guān)系的進程,以文件形式存在于文件系統(tǒng)中(有路徑和文件名),數(shù)據(jù)仍存儲在內(nèi)核,讀寫方式與普通文件一致。
- 創(chuàng)建方式:通過
mkfifo()函數(shù)或mkfifo命令創(chuàng)建(如mkfifo /tmp/myfifo)。 - 通信邏輯:進程A打開FIFO文件寫入數(shù)據(jù),進程B打開同一FIFO文件讀取數(shù)據(jù),實現(xiàn)跨進程通信。
- 關(guān)鍵區(qū)別:匿名管道僅用于親緣進程,F(xiàn)IFO可用于任意進程;兩者均遵循“先進先出”(FIFO)規(guī)則。
2. 共享內(nèi)存(Shared Memory)—— 最快的IPC機制
共享內(nèi)存是讓多個進程直接訪問同一塊物理內(nèi)存區(qū)域,無需數(shù)據(jù)拷貝(管道/消息隊列需內(nèi)核拷貝),是效率最高的IPC方式。
- 核心特點:
- 內(nèi)存區(qū)域由內(nèi)核創(chuàng)建,映射到多個進程的虛擬地址空間;
- 進程直接讀寫該內(nèi)存,無需系統(tǒng)調(diào)用轉(zhuǎn)發(fā)(僅初始化時需調(diào)用);
- 無內(nèi)置同步機制,需配合信號量(Semaphore)/互斥鎖(Mutex)避免數(shù)據(jù)競爭。
- 創(chuàng)建與使用步驟:
- 父進程通過
shmget()創(chuàng)建共享內(nèi)存段(指定鍵值、大小、權(quán)限); - 通過
shmat()將共享內(nèi)存映射到自身虛擬地址空間; fork()子進程,子進程繼承映射關(guān)系(或其他進程通過相同鍵值連接);- 進程讀寫共享內(nèi)存,通過信號量同步;
- 通信結(jié)束后,
shmdt()解除映射,shmctl()刪除共享內(nèi)存段。
- 父進程通過
- 代碼示例(父子進程共享內(nèi)存):
#include <iostream>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <cstring>
#define SHM_KEY 1234 // 共享內(nèi)存鍵值(唯一標(biāo)識)
#define SHM_SIZE 1024 // 共享內(nèi)存大小
int main() {
// 創(chuàng)建共享內(nèi)存段
int shmid = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT | 0666);
if (shmid == -1) {
perror("shmget failed");
return 1;
}
// 將共享內(nèi)存映射到進程地址空間
char* shm_addr = (char*)shmat(shmid, NULL, 0);
if (shm_addr == (char*)-1) {
perror("shmat failed");
return 1;
}
pid_t pid = fork();
if (pid == -1) {
perror("fork failed");
return 1;
}
if (pid == 0) { // 子進程:讀取共享內(nèi)存
std::cout << "子進程讀取共享內(nèi)存:" << shm_addr << std::endl;
// 解除映射
shmdt(shm_addr);
return 0;
} else { // 父進程:寫入共享內(nèi)存
strcpy(shm_addr, "Hello from parent via shared memory!");
wait(NULL);
// 解除映射并刪除共享內(nèi)存
shmdt(shm_addr);
shmctl(shmid, IPC_RMID, NULL);
std::cout << "父進程釋放共享內(nèi)存" << std::endl;
}
return 0;
}
- 適用場景:大量數(shù)據(jù)的高頻交互(如實時數(shù)據(jù)傳輸、進程間共享大數(shù)組/結(jié)構(gòu)體)。
補充:其他常見IPC機制
| 機制 | 核心特點 | 適用場景 |
|---|---|---|
| 消息隊列 | 按類型/優(yōu)先級存儲消息,內(nèi)核管理,有容量限制 | 進程間異步、帶優(yōu)先級的消息傳輸 |
| 信號量 | 用于進程/線程同步,實現(xiàn)互斥/計數(shù) | 配合共享內(nèi)存解決競爭問題 |
| 套接字(Socket) | 支持跨網(wǎng)絡(luò)、跨主機通信,全雙工 | 網(wǎng)絡(luò)進程通信、本機跨進程通信 |
| 信號(Signal) | 簡單的異步通知(如SIGUSR1/SIGUSR2) | 進程間簡單事件通知(如退出) |
二、fork(進程)與thread(線程)的關(guān)系
fork()創(chuàng)建進程和pthread創(chuàng)建線程是兩種完全不同的并發(fā)方式,但存在關(guān)聯(lián)和關(guān)鍵區(qū)別,核心總結(jié)如下:
1. 核心區(qū)別(最易混淆的點)
| 維度 | fork(進程) | thread(線程) |
|---|---|---|
| 內(nèi)存空間 | 父子進程私有地址空間(寫時復(fù)制) | 同一進程的線程共享地址空間(代碼、數(shù)據(jù)、堆、文件描述符) |
| 資源開銷 | 高(復(fù)制頁表、文件描述符等) | 低(僅創(chuàng)建棧和寄存器上下文) |
| 通信復(fù)雜度 | 高(需IPC機制) | 低(直接讀寫共享變量,需加鎖) |
| 調(diào)度單位 | 進程是OS調(diào)度的獨立單位 | 線程是OS調(diào)度的最小單位(進程是資源分配單位) |
| 獨立性 | 進程崩潰不影響其他進程 | 線程崩潰會導(dǎo)致整個進程退出 |
| 系統(tǒng)調(diào)用 | fork()、wait()、exit() | pthread_create()、pthread_join()、pthread_exit() |
2. fork與線程的關(guān)聯(lián)場景
(1)進程內(nèi)有線程時調(diào)用fork的風(fēng)險
若父進程創(chuàng)建了多個線程后調(diào)用fork(),子進程僅會復(fù)制調(diào)用fork的那個線程,其他線程會被終止,且可能導(dǎo)致:
- 鎖狀態(tài)異常(子進程繼承父進程的鎖,但持有鎖的線程已消失,引發(fā)死鎖);
- 資源未清理(如父進程線程打開的文件、內(nèi)存)。
→ 解決方案:fork前通過pthread_atfork()注冊回調(diào)函數(shù),清理鎖/資源。
(2)fork與線程的選擇邏輯
- 用
fork():需進程隔離(如子進程崩潰不影響父進程)、利用多CPU核心(進程可被調(diào)度到不同核)、執(zhí)行獨立任務(wù)(如子進程執(zhí)行execve替換程序); - 用線程:低開銷并發(fā)、高頻數(shù)據(jù)交互、共享資源多(如共享緩存/連接池)。
(3)混合使用場景
例如:父進程創(chuàng)建線程處理網(wǎng)絡(luò)請求,同時fork子進程處理耗時的磁盤IO(避免IO阻塞主線程),但需嚴(yán)格管理資源和同步。
3. 通俗類比
- fork創(chuàng)建進程:像復(fù)制一套完整的房子(有獨立的客廳、臥室、廚房),兩家人各自住,要傳遞東西需走大門(IPC);
- 創(chuàng)建線程:像在同一套房子里多住幾個人,共享客廳/廚房(共享內(nèi)存),但拿同一碗飯時要排隊(加鎖)。
總結(jié)
- IPC機制核心:管道(匿名/命名)是基于文件描述符的單向字節(jié)流,適用于簡單通信;共享內(nèi)存是最快的IPC,直接共享物理內(nèi)存,但需同步機制;
- fork與線程的核心關(guān)系:兩者都是并發(fā)實現(xiàn)方式,fork創(chuàng)建獨立內(nèi)存空間的進程(通信需IPC),線程共享進程內(nèi)存(通信簡單但需同步),進程內(nèi)有線程時fork需注意資源和鎖的問題。
一、線程間通信(Inter-thread Communication)詳解
線程間通信是同一進程內(nèi)多個線程之間的數(shù)據(jù)交互或同步機制。由于線程共享進程的地址空間(代碼段、數(shù)據(jù)段、堆、文件描述符等),通信方式比進程間通信(IPC)更簡單,但需解決數(shù)據(jù)競爭問題。
1. 線程間通信的核心方式(按場景分類)
(1)共享內(nèi)存(最基礎(chǔ)、最常用)
線程天然共享進程的內(nèi)存空間(全局變量、堆變量、靜態(tài)變量),這是線程通信的核心基礎(chǔ)。
- 通信邏輯:一個線程修改共享變量,另一個線程讀取該變量,直接完成數(shù)據(jù)傳遞。
- 核心問題:多線程同時讀寫共享變量會引發(fā)數(shù)據(jù)競爭(如計數(shù)器被多線程同時修改導(dǎo)致值錯誤),需配合同步機制(互斥鎖、條件變量等)保證原子性。
- 代碼示例(共享變量+互斥鎖):
#include <iostream>
#include <thread>
#include <mutex>
// 共享變量(線程間通信的載體)
int shared_data = 0;
// 互斥鎖:保護共享變量,避免數(shù)據(jù)競爭
std::mutex mtx;
// 線程1:修改共享變量
void write_data() {
for (int i = 0; i < 5; ++i) {
// 加鎖:保證臨界區(qū)(修改共享變量)原子執(zhí)行
std::lock_guard<std::mutex> lock(mtx);
shared_data++;
std::cout << "寫線程:shared_data = " << shared_data << std::endl;
}
}
// 線程2:讀取共享變量
void read_data() {
for (int i = 0; i < 5; ++i) {
std::lock_guard<std::mutex> lock(mtx);
std::cout << "讀線程:shared_data = " << shared_data << std::endl;
}
}
int main() {
std::thread t1(write_data);
std::thread t2(read_data);
t1.join();
t2.join();
return 0;
}
- 適用場景:高頻、少量數(shù)據(jù)交互(如狀態(tài)標(biāo)記、計數(shù)器、配置參數(shù))。
(2)條件變量(同步+通信,解決“等待-喚醒”場景)
條件變量用于線程間的同步通信,核心是“一個線程等待某個條件滿足,另一個線程滿足條件后喚醒它”,避免線程空等浪費CPU資源。
- 核心邏輯:
- 等待線程:加鎖后檢查條件,不滿足則釋放鎖并阻塞,直到被喚醒;
- 喚醒線程:修改條件后,喚醒等待的線程,等待線程重新加鎖并檢查條件。
- 代碼示例(生產(chǎn)者-消費者模型):
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
std::queue<int> msg_queue; // 共享隊列(通信載體)
std::mutex mtx;
std::condition_variable cv; // 條件變量
// 生產(chǎn)者線程:寫入數(shù)據(jù)
void producer() {
for (int i = 1; i <= 3; ++i) {
std::lock_guard<std::mutex> lock(mtx);
msg_queue.push(i);
std::cout << "生產(chǎn)者:寫入數(shù)據(jù) " << i << std::endl;
cv.notify_one(); // 喚醒等待的消費者
}
}
// 消費者線程:讀取數(shù)據(jù)
void consumer() {
while (true) {
std::unique_lock<std::mutex> lock(mtx);
// 等待條件:隊列非空(避免虛假喚醒,用while而非if)
cv.wait(lock, []() { return !msg_queue.empty(); });
int data = msg_queue.front();
msg_queue.pop();
std::cout << "消費者:讀取數(shù)據(jù) " << data << std::endl;
lock.unlock();
if (data == 3) break; // 結(jié)束條件
}
}
int main() {
std::thread t_prod(producer);
std::thread t_cons(consumer);
t_prod.join();
t_cons.join();
return 0;
}
- 適用場景:生產(chǎn)者-消費者、任務(wù)隊列、等待某個事件觸發(fā)(如數(shù)據(jù)準(zhǔn)備完成)。
(3)信號量(計數(shù)型同步,兼顧通信)
信號量本質(zhì)是“計數(shù)器+鎖”,可用于線程間的同步,也能間接實現(xiàn)通信(如通過計數(shù)標(biāo)記數(shù)據(jù)是否就緒)。
- 核心邏輯:信號量初始值為0(表示無數(shù)據(jù)),生產(chǎn)者生產(chǎn)數(shù)據(jù)后將信號量+1,消費者獲取信號量(-1)后讀取數(shù)據(jù)。
- 代碼示例(C++17+ semaphore):
#include <iostream>
#include <thread>
#include <semaphore>
std::counting_semaphore<1> sem(0); // 初始值0:無數(shù)據(jù)
int shared_data = 0;
void producer() {
shared_data = 100;
std::cout << "生產(chǎn)者:設(shè)置shared_data = " << shared_data << std::endl;
sem.release(); // 信號量+1,通知消費者
}
void consumer() {
sem.acquire(); // 信號量-1,無數(shù)據(jù)則阻塞
std::cout << "消費者:讀取shared_data = " << shared_data << std::endl;
}
int main() {
std::thread t1(producer);
std::thread t2(consumer);
t1.join();
t2.join();
return 0;
}
- 適用場景:限制并發(fā)數(shù)(如最多5個線程同時訪問資源)、簡單的“生產(chǎn)-消費”同步。
(4)其他輔助方式
- 線程本地存儲(TLS):看似“私有”,但可通過全局指針間接通信(如主線程給子線程的TLS賦值);
- 回調(diào)函數(shù):線程執(zhí)行完任務(wù)后調(diào)用回調(diào)函數(shù),將結(jié)果傳遞給主線程;
- 原子變量(std::atomic):無需加鎖的共享變量,適用于簡單數(shù)據(jù)(如bool、int)的通信(如
std::atomic<bool> is_done = false;)。
2. 線程間通信的核心原則
- 同步優(yōu)先:所有通信必須配合同步機制(鎖、條件變量、原子操作),避免數(shù)據(jù)競爭;
- 最小臨界區(qū):鎖僅包裹必要的代碼,減少線程阻塞時間;
- 避免死鎖:加鎖順序一致、及時釋放鎖、使用
std::lock同時加多個鎖。
二、線程間通信 vs 進程間通信(IPC):區(qū)別與聯(lián)系
1. 核心區(qū)別(表格對比)
| 維度 | 線程間通信 | 進程間通信(IPC) |
|---|---|---|
| 內(nèi)存基礎(chǔ) | 共享同一進程地址空間(天然共享) | 進程地址空間私有(需內(nèi)核/文件系統(tǒng)中介) |
| 通信效率 | 極高(直接讀寫內(nèi)存,無數(shù)據(jù)拷貝) | 較低(管道/消息隊列需內(nèi)核拷貝,共享內(nèi)存除外) |
| 實現(xiàn)復(fù)雜度 | 簡單(共享變量+同步機制) | 復(fù)雜(需調(diào)用專門的IPC系統(tǒng)調(diào)用,如pipe/shmget) |
| 隔離性/安全性 | 低(一個線程崩潰導(dǎo)致整個進程退出) | 高(進程崩潰不影響其他進程) |
| 同步機制 | 互斥鎖、條件變量、原子變量、信號量 | 信號量(System V/POSIX)、文件鎖 |
| 適用范圍 | 同一進程內(nèi)的線程 | 任意進程(有無親緣關(guān)系均可) |
| 典型方式 | 共享變量、條件變量、原子變量 | 管道、共享內(nèi)存、消息隊列、套接字 |
2. 核心聯(lián)系
- 共享內(nèi)存是共性:線程間通信的“共享變量”本質(zhì)是進程內(nèi)的共享內(nèi)存;IPC的“共享內(nèi)存”是內(nèi)核級的共享內(nèi)存,本質(zhì)都是讓多個執(zhí)行單元訪問同一塊內(nèi)存;
- 同步機制互通:信號量既可用于線程同步,也可用于進程同步(System V信號量);互斥鎖也有“進程間互斥鎖”(PTHREAD_PROCESS_SHARED屬性);
- 場景互補:
- 若需低開銷、高頻交互,優(yōu)先用線程+線程間通信;
- 若需隔離性、獨立崩潰域,優(yōu)先用進程+IPC;
- 混合使用:復(fù)雜系統(tǒng)中常同時存在“進程+IPC”和“線程+線程通信”(如多進程服務(wù)器,每個進程內(nèi)有多個線程處理請求)。
3. 通俗類比
| 線程間通信 | 進程間通信(IPC) |
|---|---|
| 同一間辦公室的同事交流: 直接說話(共享變量)、舉手示意(條件變量),無需出門 | 不同辦公室的同事交流: 發(fā)郵件(管道)、共享網(wǎng)盤(共享內(nèi)存)、打電話(套接字),需借助外部工具 |
三、實戰(zhàn)選型建議(新手必看)
- 選線程間通信:
- 場景:高頻數(shù)據(jù)交互(如實時計算、UI刷新)、資源共享多(如共享緩存、數(shù)據(jù)庫連接池)、低延遲要求;
- 注意:必須做好同步,避免數(shù)據(jù)競爭和死鎖。
- 選IPC:
- 場景:進程隔離(如子進程執(zhí)行危險操作)、跨進程/跨主機通信(如客戶端-服務(wù)器)、避免單個進程崩潰影響整體;
- 注意:優(yōu)先選共享內(nèi)存(高效)或管道(簡單),套接字適用于跨網(wǎng)絡(luò)場景。
總結(jié)
- 線程間通信核心:依托進程內(nèi)共享內(nèi)存,通過共享變量+同步機制(鎖、條件變量、原子變量)實現(xiàn),簡單高效但需解決數(shù)據(jù)競爭;
- 與IPC的核心區(qū)別:線程通信基于進程內(nèi)共享內(nèi)存,IPC基于內(nèi)核/文件系統(tǒng)中介;線程通信效率高但隔離性低,IPC效率低但隔離性高;
- 核心聯(lián)系:共享內(nèi)存是兩者的共性基礎(chǔ),同步機制可互通,場景上互補。
到此這篇關(guān)于C++中fork()函數(shù)的文章就介紹到這了,更多相關(guān)C++ fork()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++ 虛函數(shù)與純虛函數(shù)的區(qū)別(深入分析)
本篇文章是對c++中虛函數(shù)與純虛函數(shù)的區(qū)別進行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C語言中自動隱式轉(zhuǎn)換與類型強制轉(zhuǎn)換實例分析
這篇文章主要介紹了C語言中自動隱式轉(zhuǎn)換與類型強制轉(zhuǎn)換實例分析,需要的朋友可以參考下2014-07-07

