21xrx.com
2024-11-22 06:43:16 Friday
登录
文章检索 我的文章 写文章
C++11 线程:简化多线程编程。
2023-06-29 20:41:18 深夜i     --     --
C++11 线程 多线程编程 代码简化 并发编程

在多线程编程中,C++的新标准C++11引入了许多新特性以简化多线程编程。这些新特性除了简化编程以外,还能够提高程序的运行效率和安全性。

首先是C++11引入的std::thread类,它能够通过一个lambda表达式或函数对象启动一个新线程,简化了原本繁琐的线程创建过程。例如,下面是一个在新线程中执行的lambda表达式:


std::thread t([](){

  std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;

});

在lambda表达式中,我们通过std::cout输出当前线程ID,然后将该表达式传入std::thread类的构造函数中,即可启动一个新线程。

除了std::thread以外,C++11还引入了std::mutex类和std::lock_guard类,用于保护共享资源的访问安全性。std::mutex类定义了一个互斥量,用于保护共享资源的互斥访问,而std::lock_guard类则用于对std::mutex对象进行加锁和解锁,以确保线程安全。例如,下面是一个使用std::mutex和std::lock_guard进行多线程访问共享资源的例子:


std::mutex mtx;

std::vector<int> v;

void foo()

{

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

  v.push_back(42);

}

int main()

{

  std::thread t1(foo);

  std::thread t2(foo);

  t1.join();

  t2.join();

  for (auto i : v)

    std::cout << i << " ";

  std::cout << std::endl;

  return 0;

}

在上面的例子中,我们定义了一个全局的std::mutex对象mtx和一个全局的std::vector ,然后定义了一个foo()函数,用于向v中加入一个整数。在foo()函数中,我们通过std::lock_guard对mtx加锁,然后在临界区内加入了整数,最后在函数返回时自动解锁。在main()函数中,我们启动了两个线程t1和t2,通过join()函数等待线程执行完毕。最后,我们输出v中的内容,会发现输出了两个整数42。

总之,C++11的多线程编程特性使得多线程编程变得更加简单、有效和安全。我们只需要关注业务逻辑,而不用担心线程安全问题。

  
  

评论区

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