C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)

简介: C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)

线程库C++11

在C++ 11引入了对多线程的支持。包括线程、互斥锁、原子操作、自动加减锁和同步。下面就分别介绍一下对应的用法。


线程Thread

线程:系统分配cup时间和调度的基本单位

头文件

#include<thread>

常用的成员函数

函数名 作用
get_id() 获取当前线程ID
join() 等待
detach() 分离


创建线程的方式

thread t1(函数地址);//无参

thread t2(函数地址,参数1,参数2,…);//有参

A a;

thread t3(&A::output,&a);成员函数,


全局函数实例:

#include <thread>
#include <string>
#include <iostream>
using namespace std;
void test1(string name)//子线程 有参
{
    for (int i = 0; i < 100; ++i)
    {
        cout << name <<  " test1:" << i << endl;
    }
}
void test2()//子线程
{
    for (int i = 0; i < 100; ++i)
    {
        cout << "test2:" << i << endl;
    }
}
int main()
{
    thread t1(test1, "线程1");//创建线程 并启动线程
    thread t2(test2);
    t1.join();//等待线程执行结束,不写会造成程序崩溃
    t2.join();
    return 0;
}


成员函数实例:

class A
{
public:
    void output(string name)
    {
        cout << "线程执行 " << name << endl;
    }
};
int main()
{
    A a;
    //格式:thread t1(函数地址 对象地址 参数1 参数2...)
    thread t1(&A::output, &a, "线程一");//成员函数做线程
    t1.join();
    return 0;
}


多线程的冲突问题

a. 出现了更高等级的指令

b. 该线程的时间片到了

互斥体Mutex

头文件

#include<mutex>

常用的成员函数

函数名 作用
lock() 加锁
unlock() 解锁


实例

#include <thread>
#include <string>
#include <iostream>
#include <mutex>
using namespace std;
int g_a = 0;
mutex g_m;//创建锁
void test3()
{
    for (int i = 0; i < 1000000; ++i)
    {
        //保证数据的完整性
        g_m.lock();//加锁
        g_a += 1;
        g_m.unlock();//解锁
    }
}
int main()
{
    thread t1(test3);
    thread t2(test3);
    thread t3(test3);
    t1.join();
    t2.join();
    t3.join();
    cout << g_a << endl;
    return 0;
}


原子操作Atomic

头文件

#include<atomic>

实例

#include <thread>
#include <iostream>
#include <atomic>
using namespace std;
atomic_int a;//将这个变量设置为int原子级别
void test3()
{
    for (int i = 0; i < 1000000; ++i)
    {
        ++a;//在执行过程中,等同于锁
    }
}
int main()
{
    thread t1(test3);
    thread t2(test3);
    thread t3(test3);
    t1.join();
    t2.join();
    t3.join();
    cout << a << endl;
    return 0;
}


自动加解锁lock_guard

在创建时调用构造函数自动加锁,出了作用域就调用析构函数解锁。

实例

#include <thread>
#include <string>
#include <iostream>
#include <mutex>
#include <atomic>
using namespace std;
int a = 0;
mutex g_m;//创建锁
void test3()
{
    for (int i = 0; i < 1000000; ++i)
    {
        lock_guard<mutex> la(g_m);//自动加锁 自动释放
        ++a;
        cout << a << endl;
    }
}
int main()
{
    thread t1(test3);
    thread t2(test3);
    thread t3(test3);
    t1.join();
    t2.join();
    t3.join();
    cout << a << endl;
    return 0;
}


同步

同步方式

  1. 信号量
  2. 事件
  3. 消息
  4. C++11中的条件变量

实例

#include <thread>
#include <string>
#include <iostream>
#include <mutex>
#include <atomic>
#include <string>
#include <condition_variable>
using namespace std;
string  buffer;
mutex m; 
condition_variable cv; //状态变量
//为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起;
void workThread()
{
    //unique_lock比lock_guard灵活很多,效率上差一点,内存占用多一点。
    unique_lock<mutex> lk(m);
    cv.wait(lk);//等待信号
    cout << "收到数据:" << buffer << endl;
}
int main()
{
    thread t1(workThread);
    string name;
    cin >> name;
    buffer = name;
    cv.notify_all();//发出通知
    t1.join();
    cout << "数据处理完成" << endl;
    return 0;
}
目录
相关文章
|
数据采集 Java API
Jsoup库能处理多线程下载吗?
Jsoup库能处理多线程下载吗?
|
6月前
|
负载均衡 算法 安全
基于Reactor模式的高性能网络库之线程池组件设计篇
EventLoopThreadPool 是 Reactor 模式中实现“一个主线程 + 多个工作线程”的关键组件,用于高效管理多个 EventLoop 并在多核 CPU 上分担高并发 I/O 压力。通过封装 Thread 类和 EventLoopThread,实现线程创建、管理和事件循环的调度,形成线程池结构。每个 EventLoopThread 管理一个子线程与对应的 EventLoop(subloop),主线程(base loop)通过负载均衡算法将任务派发至各 subloop,从而提升系统性能与并发处理能力。
357 3
|
6月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
301 0
|
8月前
|
Linux 程序员 API
CentOS如何使用Pthread线程库
这就是在CentOS下使用Pthread线程库的全过程。可见,即使是复杂的并发编程,只要掌握了基本的知识与工具,就能够游刃有余。让我们积极拥抱并发编程的魅力,编写出高效且健壮的代码吧!
234 11
Java 线程同步的四种方式,最全详解,建议收藏!
本文详细解析了Java线程同步的四种方式:synchronized关键字、ReentrantLock、原子变量和ThreadLocal,通过实例代码和对比分析,帮助你深入理解线程同步机制。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Java 线程同步的四种方式,最全详解,建议收藏!
|
安全 Java 开发者
Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用
本文深入解析了Java多线程中的`wait()`、`notify()`和`notifyAll()`方法,探讨了它们在实现线程间通信和同步中的关键作用。通过示例代码展示了如何正确使用这些方法,并分享了最佳实践,帮助开发者避免常见陷阱,提高多线程程序的稳定性和效率。
326 1
|
安全 调度 C#
STA模型、同步上下文和多线程、异步调度
【10月更文挑战第19天】本文介绍了 STA 模型、同步上下文和多线程、异步调度的概念及其优缺点。STA 模型适用于单线程环境,确保资源访问的顺序性;同步上下文和多线程提高了程序的并发性和响应性,但增加了复杂性;异步调度提升了程序的响应性和资源利用率,但也带来了编程复杂性和错误处理的挑战。选择合适的模型需根据具体应用场景和需求进行权衡。
390 0
|
3月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
195 6
|
6月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
344 83
|
3月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
378 0

热门文章

最新文章