21xrx.com
2025-04-28 11:25:19 Monday
文章检索 我的文章 写文章
C++11多线程编程介绍
2023-06-28 17:20:07 深夜i     15     0
C++11 多线程编程 介绍

C++11 多线程编程是在 C++11 语言标准中引入的一种特性,它使得并发编程更加容易。通过多线程编程,我们可以让计算机在同时运行多个线程的情况下,更加高效地完成任务。

C++11 多线程编程的基本概念包括线程、互斥锁、条件变量、原子操作等。其中,线程是 C++11 中最基本的多线程编程概念。通过 C++11 中提供的 std::thread 类,我们可以方便地创建新的线程。例如:

void my_thread_func()
  // 线程需要执行的逻辑
int main() {
  std::thread my_thread(my_thread_func);
  // main 线程继续执行其他逻辑
  my_thread.join();
  return 0;
}

在上面的例子中,我们首先定义了一个函数 my_thread_func(),这个函数将会在新线程中被执行。接着,我们通过 std::thread 创建了一个新的线程,并将 my_thread_func() 传递给该线程。在 main 函数中,我们可以继续执行其他逻辑。最后,我们使用 my_thread.join() 等待该线程执行完成。

在多线程编程中,我们需要考虑线程之间的同步问题。例如,多个线程同时访问共享的资源时可能会导致数据竞争的问题。为了避免这种问题,C++11 提供了互斥锁(即 std::mutex)和条件变量(即 std::condition_variable)等机制,可以实现线程之间的同步和协作。例如:

#include <mutex>
#include <condition_variable>
#include <queue>
std::mutex mtx;
std::condition_variable cv;
std::queue<int> q;
void producer() {
  for (int i = 0; i < 10; ++i) {
    {
      std::lock_guard<std::mutex> lock(mtx);
      q.push(i);
    }
    cv.notify_one(); // 通知消费者线程
  }
}
void consumer() {
  while (true) {
    std::unique_lock<std::mutex> ulock(mtx);
    cv.wait(ulock, []{ return !q.empty(); }); // 等待队列不为空
    int val = q.front();
    q.pop();
    ulock.unlock();
    // 处理 val 的逻辑
  }
}
int main() {
  std::thread t1(producer), t2(consumer);
  t1.join();
  t2.join();
  return 0;
}

在上面的例子中,我们定义了一个生产者线程和一个消费者线程,它们共享一个队列 q,生产者会将元素压入队列,消费者会从队列中取出元素并进行处理。为了避免数据竞争,我们添加了互斥锁 mtx,并使用 std::lock_guard 对互斥锁进行自动加锁和解锁。为了使消费者能够在队列为空时等待,我们定义了一个条件变量 cv,并在消费者中使用 cv.wait() 等待生产者线程的通知。当生产者向队列中添加新元素时,它会通过 cv.notify_one() 通知消费者线程。这样,我们可以实现线程之间的同步和协作。

除了互斥锁和条件变量之外,C++11 还引入了原子操作机制(即 std::atomic),可以保证对共享变量的操作是原子的。例如:

#include <atomic>
std::atomic<int> counter;
void my_thread_func() {
  for (int i = 0; i < 10000; ++i) {
    counter++;
  }
}
int main() {
  std::thread t1(my_thread_func), t2(my_thread_func);
  t1.join(); t2.join();
  std::cout << counter.load() << std::endl;
  return 0;
}

在上面的例子中,我们定义了一个全局变量 counter,并使用 std::atomic 进行定义。在 my_thread_func() 函数中,我们通过 counter++ 对 counter 进行累加操作。由于 std::atomic 提供了原子操作机制,因此我们不需要再使用互斥锁来保证线程安全。

总之,C++11 多线程编程是一项非常有用的技能,可以用于提高程序的性能和并发能力。通过使用 C++11 中提供的线程、互斥锁、条件变量、原子操作等特性,我们可以实现线程之间的同步和协作,避免数据竞争的问题。值得注意的是,在进行多线程编程时一定要谨慎编写,避免出现线程安全问题,以免造成程序崩溃或数据不一致等问题。

  
  

评论区