21xrx.com
2024-06-03 05:40:37 Monday
登录
文章检索 我的文章 写文章
C++ 11线程:多线程编程新特性详解
2023-07-01 19:40:24 深夜i     --     --
C++ 11 线程 多线程 编程特性 新特性

C++ 11是C++语言的一个重要版本,它引入了许多新的编程特性,其中包括了对多线程编程的支持。在之前的C++版本中,多线程编程是依赖于操作系统提供的API进行实现的,而C++ 11中,它提供了一些新的语言特性来方便多线程编程。

一、线程库

C++ 11的线程库提供了创建线程、传递参数、等待线程完成、线程对象析构等一系列操作的函数。

其中,创建线程的函数为std::thread,用法如下:


std::thread th([](int arg){ /* 线程操作 */ }, arg);

该函数接受一个函数对象和它的参数,创建一个新的线程来调用这个函数。

二、互斥量和条件变量

互斥量用于保护共享资源的访问,条件变量用于线程间的通信。

互斥量的使用方法如下:


std::mutex mtx; // 定义一个互斥量

mtx.lock(); // 加锁

// 访问共享资源

mtx.unlock(); // 解锁

条件变量的使用方法如下:


std::condition_variable cond;

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

cond.wait(lck, [](){ return /* 条件 */; });

// 执行线程操作

cond.notify_all();

等待条件变量时,线程会进入等待状态,直到条件成立或被中断。唤醒线程可以使用notify_one或notify_all函数。

三、原子操作

原子操作用于保证多个线程同时对同一变量进行读写时的一致性。

C++ 11提供了一系列的原子操作函数,例如:


std::atomic<int> i = 0; // 定义一个原子变量

i.store(1); // 存储1

int j = i.load(); // 加载值

i.fetch_add(1); // 原子加1

i.fetch_sub(1); // 原子减1

使用原子操作能够避免出现数据竞争和多线程同步问题。

四、并发队列

并发队列用于在线程间传递数据,是多线程编程中常用的数据结构之一。

C++ 11提供了std::queue和std::priority_queue的线程安全版本,分别为std::queue 和std::priority_queue 。使用这些并发队列,我们可以避免出现多线程访问同一队列造成的竞争问题。


std::queue<int> q;

std::mutex mtx;

// 线程1

{

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

  q.push(1);

}

// 线程2

{

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

  if(!q.empty())

  {

    int value = q.front();

    q.pop();

  }

}

以上是使用互斥量实现的简单队列,但由于没有进行同步,多线程并发访问时会出现竞争问题。我们可以将std::queue改为std::queue 以实现线程安全。

总之,C++ 11为多线程编程带来了诸多方便,例如线程库、互斥量和条件变量、原子操作和并发队列等。它们的引入使得多线程编程变得更加容易和可靠,也为软件开发带来更多的可能性。

  
  

评论区

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