91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

c++多線程共享數據怎么實現

c++
小億
108
2024-01-02 10:25:00
欄目: 編程語言

在C++中,共享數據的多線程實現可以使用互斥鎖(mutex)和條件變量(condition variable)來實現。

互斥鎖用于保護共享數據,確保在任意時刻只有一個線程可以訪問共享數據。當一個線程要訪問共享數據時,它需要先獲取互斥鎖,然后在訪問完共享數據后釋放互斥鎖,以便其他線程可以繼續訪問。

條件變量用于線程之間的同步和通信。一個線程可以通過等待條件變量來等待某個條件成立,而另一個線程可以通過發出信號來通知等待的線程條件已經成立。條件變量通常與互斥鎖一起使用,以保證在等待條件時不會出現競態條件。

下面是一個示例代碼,演示了如何使用互斥鎖和條件變量實現多線程共享數據的方式:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mtx;  // 互斥鎖
std::condition_variable cv;  // 條件變量
int sharedData = 0;  // 共享數據

void worker(int id) {
  std::unique_lock<std::mutex> lock(mtx);  // 獲取互斥鎖

  // 等待共享數據被更新為指定值
  cv.wait(lock, []{ return sharedData == 42; });

  // 訪問共享數據
  std::cout << "Thread " << id << ": Shared data = " << sharedData << std::endl;

  // 釋放互斥鎖
  lock.unlock();
}

int main() {
  std::thread t1(worker, 1);
  std::thread t2(worker, 2);

  // 更新共享數據
  std::this_thread::sleep_for(std::chrono::seconds(2));  // 模擬一段耗時操作
  {
    std::lock_guard<std::mutex> lock(mtx);  // 獲取互斥鎖

    sharedData = 42;

    // 通知等待的線程條件已經成立
    cv.notify_all();
  }

  t1.join();
  t2.join();

  return 0;
}

在這個示例中,有兩個線程(t1t2)等待共享數據被更新為指定值(42)。主線程在等待一段時間后更新共享數據,并通知等待的線程條件已經成立。等待的線程被喚醒后會再次獲取互斥鎖并訪問共享數據。

需要注意的是,互斥鎖和條件變量的使用必須是配對的,即在等待條件時必須使用相同的互斥鎖。另外,使用互斥鎖和條件變量時要避免死鎖和競態條件的發生,需要仔細設計和調整線程的執行順序和操作。

0
高唐县| 色达县| 定结县| 台中市| 上杭县| 思南县| 古蔺县| 开江县| 怀远县| 盐池县| 宾川县| 桐城市| 天气| 洛隆县| 河池市| 腾冲县| 泰州市| 麦盖提县| 乐安县| 新丰县| 电白县| 塘沽区| 锦州市| 霍城县| 榆树市| 山阳县| 宜阳县| 玉环县| 闻喜县| 吴忠市| 博罗县| 新郑市| 鞍山市| 博乐市| 铜梁县| 松江区| 新乐市| 雷波县| 建德市| 日照市| 浑源县|