21xrx.com
2024-11-24 12:20:59 Sunday
登录
文章检索 我的文章 写文章
C++11多线程源码分享
2023-07-08 06:22:31 深夜i     --     --
C++11 多线程 源码分享

C++11是C++语言的一个版本,在很多方面都有着很大的改进和升级,其中一个主要的利好就是对多线程编程的支持。C++11很好地整合了多线程编程的概念,使得编写多线程程序变得更加容易。本文将分享一下C++11多线程源码。

1.线程

C++11增加了一个std::thread类,它允许用户轻松地创建和管理线程。新的线程可以使用类似函数指针的函数作为参数,并且可以使用类似lambda表达式的语法来创建一个新的线程。

以下是一个简单的样例:


#include <iostream>

#include <thread>

void sayHello()

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

int main() {

  std::thread t(sayHello);

  t.join();

  return 0;

}

这个程序的作用是在一个新线程中调用sayHello()函数并输出“Hello World!”。

2.互斥量

C++11中的std::mutex用于实现互斥量,它是一种用于同步多个线程访问共享资源的线程同步原语。互斥量允许我们在任意时刻只有一个线程可以访问共享资源,从而避免了资源竞争的问题。

以下是一个简单的互斥量使用样例:


#include <iostream>

#include <thread>

#include <mutex>

std::mutex m;

void increment(int& x) {

  m.lock();

  ++x;

  m.unlock();

}

int main() {

  int x = 0;

  std::thread t1(increment, std::ref(x));

  std::thread t2(increment, std::ref(x));

  t1.join();

  t2.join();

  std::cout << "x = " << x << std::endl;

  return 0;

}

该程序的作用是启动两个线程,每个线程将变量x自增1。由于x是共享资源,因此必须使用互斥量进行同步。

3.条件变量

C++11中的std::condition_variable用于实现条件变量。条件变量是一种线程同步原语,它允许一个或多个线程等待一些特定的事件发生。当条件变量满足特定的条件时,等待的线程将被唤醒并继续执行。

以下是一个简单的条件变量使用样例:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

std::mutex m;

std::condition_variable cv;

bool flag = false;

void printMessage() {

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

  while (!flag) {

    cv.wait(lock);

  }

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

}

int main() {

  std::thread t(printMessage);

  std::this_thread::sleep_for(std::chrono::seconds(1));

  {

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

    flag = true;

  }

  cv.notify_all();

  t.join();

  return 0;

}

该程序的作用是启动一个新线程,该线程将在条件变量满足特定的条件时输出“Hello World!”。在主线程中,我们使用std::this_thread::sleep_for()函数来休眠1秒钟,然后通过设置flag和cv.notify_all()函数来满足条件变量的等待条件。

总结

C++11对多线程编程进行了很大的改进和升级,它引入了std::thread、std::mutex和std::condition_variable等类来帮助程序员更加轻松地编写多线程程序。本文中给出了一些简单的样例来说明这些类的使用方法,希望对大家有所帮助。

  
  

评论区

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