C 中執行緒間通訊的方法包括:共享記憶體、同步機制(互斥鎖、條件變數)、管道、訊息佇列。例如,使用互斥鎖保護共享計數器:聲明互斥鎖(m)、共享變數(counter);每個執行緒透過加鎖(lock_guard)更新計數器;確保一次只有一個執行緒更新計數器,防止競爭條件。
在多執行緒應用程式中,執行緒需要能夠互相溝通以協調任務和共享資料。 C 提供了多種機制來實現線程間通信,包括:
使用共享內存,多個線程可以存取同一塊記憶體區域。這是一種低開銷的方法,但需要小心避免競爭條件。
int shared_data = 0; void thread_1() { shared_data++; // 可能会被其他线程同时访问 } void thread_2() { shared_data++; // 可能会同时导致不正确的结果 }
同步機制可用於在存取共用資源時協調執行緒。
互斥鎖提供互斥訪問,確保一次只有一個執行緒可以存取共享資源。
std::mutex m; void thread_1() { std::lock_guard<std::mutex> l(m); // 获取互斥锁 // 访问共享资源 } void thread_2() { std::lock_guard<std::mutex> l(m); // 获取互斥锁 // 访问共享资源 }
條件變數允許執行緒等待特定條件滿足。
std::condition_variable cv; std::mutex m; void producer() { std::lock_guard<std::mutex> l(m); // 获取互斥锁 while (!condition) { // 等待条件满足 cv.wait(l); } // 生产数据 } void consumer() { std::lock_guard<std::mutex> l(m); // 获取互斥锁 condition = true; cv.notify_all(); // 唤醒所有等待线程 }
管道是一種 unidirectional 通訊機制,用於在兩個執行緒之間傳輸資料。
std::pipe pipe; void writer() { std::string message = "hello"; std::write(pipe[1], message.c_str(), message.length()); } void reader() { std::string message; std::read(pipe[0], message.data(), message.size()); }
訊息佇列提供了一個非同步的訊息傳遞機制。
key_t key = ftok("message_queue", 'a'); int message_queue = msgget(key, IPC_CREAT | 0666); void sender() { Message msg; msg.mtext = "hello"; msgsnd(message_queue, &msg, sizeof(msg.mtext), IPC_NOWAIT); } void receiver() { Message msg; msgrcv(message_queue, &msg, sizeof(msg.mtext), 0, 0); }
實戰案例:使用互斥鎖保護共享計數器
假設我們有一個共享計數器,需要由多個執行緒並發更新。我們可以使用互斥鎖來保護這個計數器:
std::mutex m; int counter = 0; void thread_1() { for (int i = 0; i < 1000000; i++) { std::lock_guard<std::mutex> l(m); counter++; } } void thread_2() { for (int i = 0; i < 1000000; i++) { std::lock_guard<std::mutex> l(m); counter--; } }
這樣可以確保在任何給定時間只有一個執行緒可以更新計數器,從而防止競爭條件。
以上是C++並發程式設計:如何處理線程間通訊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!