首頁 > 後端開發 > C++ > C++並發程式設計:如何處理線程間通訊?

C++並發程式設計:如何處理線程間通訊?

WBOY
發布: 2024-05-04 12:45:02
原創
504 人瀏覽過

C 中執行緒間通訊的方法包括:共享記憶體、同步機制(互斥鎖、條件變數)、管道、訊息佇列。例如,使用互斥鎖保護共享計數器:聲明互斥鎖(m)、共享變數(counter);每個執行緒透過加鎖(lock_guard)更新計數器;確保一次只有一個執行緒更新計數器,防止競爭條件。

C++並發程式設計:如何處理線程間通訊?

C 並發程式設計:如何處理執行緒間通訊?

在多執行緒應用程式中,執行緒需要能夠互相溝通以協調任務和共享資料。 C 提供了多種機制來實現線程間通信,包括:

共享記憶體

使用共享內存,多個線程可以存取同一塊記憶體區域。這是一種低開銷的方法,但需要小心避免競爭條件。

int shared_data = 0;

void thread_1() {
  shared_data++; // 可能会被其他线程同时访问
}

void thread_2() {
  shared_data++; // 可能会同时导致不正确的结果
}
登入後複製

同步機制

同步機制可用於在存取共用資源時協調執行緒。

互斥鎖(Mutex)

互斥鎖提供互斥訪問,確保一次只有一個執行緒可以存取共享資源。

std::mutex m;

void thread_1() {
  std::lock_guard<std::mutex> l(m); // 获取互斥锁
  // 访问共享资源
}

void thread_2() {
  std::lock_guard<std::mutex> l(m); // 获取互斥锁
  // 访问共享资源
}
登入後複製

條件變數(Condition Variable)

條件變數允許執行緒等待特定條件滿足。

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(); // 唤醒所有等待线程
}
登入後複製

管道(Pipe)

管道是一種 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());
}
登入後複製

訊息佇列(Message Queue)

訊息佇列提供了一個非同步的訊息傳遞機制。

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板