21xrx.com
2024-12-22 16:44:42 Sunday
登录
文章检索 我的文章 写文章
C++11多线程编程入门
2023-07-13 17:21:08 深夜i     --     --
C++11 多线程编程 入门教程 并发编程 线程池

随着计算机硬件的不断发展,多核处理器的普及,多线程编程已经成为了程序员必备的技能之一。C++11引入了许多新特性,包括对多线程编程的支持,使得C++成为了一种强大的多线程编程语言。

C++11的多线程编程利用了标准库中的 等头文件。其中, 支持创建和管理线程, 则提供了互斥量和条件变量等同步工具。在使用多线程编程时,我们需要考虑线程的创建、传参、同步和终止等方面。

首先,我们需要了解C++11中的线程类std::thread的基本使用。std::thread的构造函数可以接受一个可调用对象(函数指针、函数对象或者Lambda表达式),并将它作为新线程的入口点运行。下面是一个简单的例子:


void foo()

  // do something

int main() {

  std::thread t1(foo);

  t1.join();

  return 0;

}

上面的代码创建了一个线程t1,将函数foo作为其入口点,并在主线程中等待t1执行完毕后继续运行。

如果我们需要给线程传递参数,可以在创建线程时将参数作为额外的参数传入:


void foo(int x)

  // do something with x

int main() {

  int x = 42;

  std::thread t1(foo, x);

  t1.join();

  return 0;

}

上面的代码创建了一个线程t1,将整数x作为参数传递给了函数foo,然后在主线程中等待t1执行完毕后继续运行。

在多线程编程中,同步是至关重要的。 C++11提供了多种同步工具,最常用的是互斥量(std::mutex)和条件变量(std::condition_variable)。

互斥量是一种用于保护共享资源的同步工具,提供了加锁(lock)和解锁(unlock)操作,以确保同一时刻只有一个线程能够访问共享资源。条件变量则提供了一种机制,允许线程在某个条件满足时才能继续执行。在使用条件变量时,线程可以等待条件变量的通知(wait),也可以通过通知(notify_one或者notify_all)来唤醒等待的线程。

下面是一个使用互斥量和条件变量的例子:


#include <thread>

#include <mutex>

#include <condition_variable>

#include <iostream>

std::mutex mtx;

std::condition_variable cv;

bool ready = false;

void foo() {

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

  // do something

  ready = true;

  cv.notify_one();

}

int main() {

  std::thread t1(foo);

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

  while(!ready) {

    cv.wait(lock);

  }

  std::cout << "Thread finished." << std::endl;

  t1.join();

  return 0;

}

上面的代码创建了一个线程t1,让它执行函数foo。在主线程中,我们使用互斥量和条件变量来等待线程t1执行完毕后再继续执行。在foo函数中,当线程完成任务后,通过notify_one函数通知主线程,之后主线程就可以继续运行了。

多线程编程是一项复杂的技术,需要仔细思考和谨慎使用。在使用多线程编程时,我们需要尽可能避免竞态条件和死锁等问题,并合理地使用各种同步工具来确保程序的正确性。

总之,C++11已经成为了一种强大的多线程编程语言,我们可以通过使用标准库中的多线程支持来轻松地实现复杂的并发任务。如果你还没有开始探索C++11的多线程编程,请尽快开始吧!

  
  

评论区

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