21xrx.com
2024-12-27 20:47:13 Friday
登录
文章检索 我的文章 写文章
C++多线程共享变量实现
2023-07-10 13:42:10 深夜i     --     --
C++ 多线程 共享变量 实现 并发编程

C++是一种广泛使用的编程语言,是那些需要高效处理大量数据的应用的首选。随着计算机硬件的发展,多核处理已经成为现代计算机的一个常见特征,这就要求我们在编写应用程序时必须考虑多线程编程。在多线程编程中,共享变量是非常重要的一个概念,下面我们将介绍如何在C++中实现多线程共享变量。

在C++中,实现多线程共享变量需要使用互斥量(mutex)和条件变量(condition variable)。互斥量可以确保每次只有一个线程对共享变量进行读写操作,而条件变量可以让线程等待某个状态的改变,然后再继续执行。

下面是一个简单的示例,演示如何在C++中使用互斥量和条件变量实现多线程共享变量。假设我们要编写一个多线程程序,计算1到100之间所有数字的平均值。


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

std::mutex mutex_;

std::condition_variable condVar_;

int sum_{0};

bool done_{false};

void workerThread()

{

  for (int i = 1; i <= 100; ++i)

  {

    std::unique_lock<std::mutex> lock{mutex_};

    sum_ += i;

  }

  {

    std::unique_lock<std::mutex> lock{mutex_};

    done_ = true;

  }

  condVar_.notify_all();

}

int main()

{

  std::thread worker{workerThread};

  {

    std::unique_lock<std::mutex> lock{mutex_};

    condVar_.wait(lock, []{return done_;});

    std::cout << "The average is " << sum_ / 100.0 << '\n';

  }

  worker.join();

  return 0;

}

在这个例子中,我们创建了一个互斥量和一个条件变量。我们还定义了一个 sum_ 变量用于存储所有数字的和,一个 done_ 变量用于表示线程是否完成计算。

在 workerThread 函数中,我们使用互斥量对 sum_ 变量进行加锁,然后将所有数字的和累加到 sum_ 变量中。一旦计算完成,我们使用互斥量对 done_ 变量进行加锁,并设置其值为 true。最后,我们使用条件变量通知所有等待条件为 done_ 的线程。

在主函数中,我们创建了一个 worker 线程,并使用条件变量等待 worker线程完成计算。一旦 worker 线程完成计算并通知了条件变量,我们就释放了互斥量并输出计算结果。

通过使用互斥量和条件变量,我们可以轻松地实现多线程共享变量。无论我们要编写什么样的多线程应用程序,都可以使用这些技术来确保线程安全。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复