21xrx.com
2024-09-19 10:07:49 Thursday
登录
文章检索 我的文章 写文章
C++多线程编程实例
2023-07-05 04:35:58 深夜i     --     --
C++ 多线程编程 实例 并发编程 线程同步

随着计算机技术的不断发展,多线程编程越来越重要。作为一种高效的编程模式,多线程编程能够提升程序的并发性,从而提高程序的性能和响应能力。而C++作为一种高性能的编程语言,也提供了多线程编程的支持。接下来,我们将介绍C++多线程编程的实例。

1. 创建线程

首先,我们需要了解如何创建一个线程。在C++中,我们可以使用std::thread来创建新线程。下面是一个简单的示例代码:


#include <iostream>

#include <thread>

void say_hello()

world!" << std::endl;

int main()

{

  std::thread t(say_hello);

  t.join();

  return 0;

}

在这个示例中,我们定义了一个函数say_hello,它会输出一句话。然后我们使用std::thread来创建一个新线程t,并将say_hello函数作为参数传递给了它。最后,我们调用了t.join(),等待线程t执行完毕。

2. 互斥锁

在多线程编程中,很容易出现资源竞争的问题。为了避免这种问题,我们需要使用互斥锁来保护共享资源。在C++中,我们可以使用std::mutex来实现互斥锁。下面是一个简单的示例代码:


#include <iostream>

#include <thread>

#include <mutex>

std::mutex g_mutex;

void increment_counter(int& counter)

{

  std::lock_guard<std::mutex> lock(g_mutex);

  counter++;

}

int main()

{

  int counter = 0;

  std::thread t1(increment_counter, std::ref(counter));

  std::thread t2(increment_counter, std::ref(counter));

  t1.join();

  t2.join();

  std::cout << "Counter value: " << counter << std::endl;

  return 0;

}

在这个示例中,我们定义了一个计数器counter,并定义了一个函数increment_counter来对它进行递增操作。在increment_counter函数中,我们使用std::lock_guard 来创建了一个互斥锁lock,对counter进行了互斥保护。然后我们使用std::ref(counter)将counter作为参数传递给了t1和t2线程。最后,我们调用了t1.join()和t2.join()等待这两个线程执行完毕,并输出了counter的值。

3. 条件变量

除了互斥锁,条件变量也是多线程编程中常用的一种技术。条件变量可以让线程在等待某个条件满足时进入睡眠状态,并在条件满足时被唤醒。在C++中,我们可以使用std::condition_variable来实现条件变量。下面是一个简单的示例代码:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

std::mutex g_mutex;

std::condition_variable g_cv;

bool g_flag = false;

void producer()

{

  std::unique_lock<std::mutex> lock(g_mutex);

  // 等待消费者消费

  while (g_flag)

  {

    g_cv.wait(lock);

  }

  // 生产数据

  std::cout << "Producing data..." << std::endl;

  // 通知消费者可以消费了

  g_flag = true;

  g_cv.notify_all();

}

void consumer()

{

  std::unique_lock<std::mutex> lock(g_mutex);

  // 等待生产者生产

  while (!g_flag)

  {

    g_cv.wait(lock);

  }

  // 消费数据

  std::cout << "Consuming data..." << std::endl;

  // 通知生产者可以生产了

  g_flag = false;

  g_cv.notify_all();

}

int main()

{

  std::thread t1(producer);

  std::thread t2(consumer);

  t1.join();

  t2.join();

  return 0;

}

在这个示例中,我们定义了一个生产者线程和一个消费者线程。生产者线程负责生产数据,消费者线程负责消费数据。为了保证线程之间的同步,我们使用了一个互斥锁g_mutex和一个条件变量g_cv。在producer函数中,如果消费者已经消费了数据,那么生产者线程将会进入睡眠状态,并等待g_cv被唤醒。当消费者消费完数据后,它会通知生产者可以生产数据了,然后生产者线程继续执行。在consumer函数中,如果生产者还没有生产数据,那么消费者线程将会进入睡眠状态,并等待g_cv被唤醒。当生产者生产数据后,它会通知消费者可以消费数据了,然后消费者线程继续执行。

总之,C++多线程编程是一种很有用的编程技术,它可以实现程序的并发性,从而提高程序的性能和响应能力。除了上述案例之外,C++还提供了许多其他的多线程编程技术,如原子操作、线程池等。只要我们理解了多线程编程的基本原理,就可以运用这些技术来编写高效、可靠的多线程程序。

  
  

评论区

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