21xrx.com
2024-12-22 16:24:17 Sunday
登录
文章检索 我的文章 写文章
C++多线程实战:从入门到精通
2023-07-13 09:42:50 深夜i     --     --
C++ 多线程 实战 入门 精通

C++是一门广泛使用的编程语言,拥有不少优秀的多线程库,能为程序员提供强大的处理任务的支持。本文将介绍C++多线程的基础和高级用法,帮助读者从入门到精通这项技术。

基础多线程

在C++中,使用多线程需要包含头文件 。首先介绍基本的使用方法。先创建一个线程对象,然后让这个对象执行一个函数或者一个可调用的对象。下面是一个简单的例子:


#include <iostream>

#include <thread>

void printHello()

  std::cout << "Hello World!" << std::endl;

int main()

{

  std::thread t(printHello);

  t.join();

  return 0;

}

这个程序创建一个线程对象t并让它执行函数printHello。由于printHello函数无参数无返回值,因此可以直接传给线程对象。

注意在main函数推出之前使用join方法等待线程结束。如果不这样做,程序将在t对象析构时调用的std::terminate()抛出未处理异常并崩溃。

线程对象也可以执行带参数或者返回值的函数。下面的例子演示了如何传递参数和接收返回值:


#include <iostream>

#include <thread>

void add(int a, int b, int& result)

{

  result = a + b;

}

int main()

{

  int result;

  std::thread t(add, 10, 20, std::ref(result));

  t.join();

  std::cout << "The result is: " << result << std::endl;

  return 0;

}

这个程序创建了一个线程对象t,并将参数10和20传递给add函数执行。线程执行完毕后,将结果通过引用的方式传递给参数result,并在主线程输出。

高级多线程

C++还提供了更高级的多线程支持。下面介绍一些常用的高级技巧。

1. 互斥量(mutex)

当多个线程同时操作共享资源时,需要保证这些操作的原子性。如果没有这样的保证,将出现数据不一致或者程序崩溃的风险。

互斥量(mutex)是一种保证共享资源同步访问的工具。简单来说,就是一个锁,只有一个线程能够持有它,并访问共享资源。下面是一个使用互斥量的例子:


#include <iostream>

#include <thread>

#include <mutex>

int counter = 0;

std::mutex mtx;

void increaseCounter()

{

  for (int i = 0; i < 10000; ++i)

  {

    mtx.lock();

    ++counter;

    mtx.unlock();

  }

}

int main()

{

  std::thread t1(increaseCounter);

  std::thread t2(increaseCounter);

  t1.join();

  t2.join();

  std::cout << "The counter is: " << counter << std::endl;

  return 0;

}

这个程序使用互斥量实现了共享资源counter的同步访问。注意,mutex 的 lock 和 unlock 方法通过 RAII 方式保证了互斥量被正确释放。

2. 条件变量(condition variable)

条件变量是另一种线程同步机制。与互斥量搭配使用,可以实现的机制包括:

- 等待某个条件的发生

- 在某个条件发生时通知一个/多个等待线程

下面是一个等待线程的例子:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

bool isDataReady = false;

std::mutex mtx;

std::condition_variable cv;

void processData()

{

  // 模拟数据处理

  std::this_thread::sleep_for(std::chrono::milliseconds(1000));

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

  isDataReady = true;

  cv.notify_one();

}

int main()

{

  std::cout << "Waiting for data..." << std::endl;

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

  cv.wait(lock, [] return isDataReady; );

  std::cout << "Data is ready!" << std::endl;

  return 0;

}

这个程序使用条件变量实现了等待某个条件发生。其中,wait方法被解释为“线程阻塞等待”,直到条件isDataReady为true,并发出唤醒当前正在等待的线程。

总结

本文介绍了C++多线程的基本和高级用法,包括创建线程、传递参数、互斥量和条件变量等内容。对于需要处理高并发情况的程序员来说,熟练运用多线程是必备的技能之一。同时,多线程应用需要注意线程安全和避免死锁等问题,需要谨慎设计和编码。

  
  

评论区

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