中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

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
潜山县| 望城县| 南皮县| 荆州市| 沭阳县| 庐江县| 准格尔旗| 桐乡市| 崇礼县| 津南区| 八宿县| 岳阳县| 南充市| 宿州市| 三明市| 安国市| 永仁县| 电白县| 莫力| 黄冈市| 双牌县| 清水河县| 怀安县| 修水县| 湟源县| 文安县| 庆安县| 惠州市| 安乡县| 北辰区| 鄂尔多斯市| 留坝县| 连山| 繁峙县| 寿阳县| 济宁市| 泗阳县| 建昌县| 磐石市| 呼玛县| 宝应县|