线程是程序中的轻量级执行单元,允许程序同时执行多个任务。
多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。
一般情况下,两种类型的多任务处理:基于进程和基于线程。
C++多线程编程涉及在一个程序中创建和管理多个并发执行的线程。
C++提供了强大的多线程支持,特别是在C++11标准及其之后,通过
C++11及以后的标准提供了多线程支持,核心组件包括:
注意:之前一些编译器使用C++11的编译参数是-std=c++11:
g++-std=c++11test.cppstd::thread
#include
使用g++-std=c++11编译后,执行输出结果为:
Hellofromthread(functionpointer)!Hellofromthread(functionpointer)!Hellofromthread(functionpointer)!Hellofromthread(functionpointer)!Hellofromthread(functionpointer)!使用函数对象通过类中的operator()方法定义函数对象来创建线程:
Hellofromthread(functionobject)!Hellofromthread(functionobject)!Hellofromthread(functionobject)!Hellofromthread(functionobject)!Hellofromthread(functionobject)!使用Lambda表达式Lambda表达式可以直接内联定义线程执行的代码:
Hellofromthread(lambda)!Hellofromthread(lambda)!Hellofromthread(lambda)!Hellofromthread(lambda)!Hellofromthread(lambda)!线程管理join()join()用于等待线程完成执行。如果不调用join()或detach()而直接销毁线程对象,会导致程序崩溃。
t.join();detach()detach()将线程与主线程分离,线程在后台独立运行,主线程不再等待它。
t.detach();线程的传参值传递参数可以通过值传递给线程:
std::threadt(func,arg1,arg2);引用传递如果需要传递引用参数,需要使用std::ref:
以下是一个完整的示例,展示了如何使用上述三种方式创建线程,并进行线程管理。
使用C++11的编译参数-std=c++11:
g++-std=c++11test.cpp当上面的代码被编译和执行时,它会产生下列结果:
线程1、2、3独立运行线程使用函数指针作为可调用参数线程使用函数指针作为可调用参数线程使用函数指针作为可调用参数线程使用函数对象作为可调用参数线程使用函数对象作为可调用参数线程使用函数对象作为可调用参数线程使用lambda表达式作为可调用参数线程使用lambda表达式作为可调用参数线程使用lambda表达式作为可调用参数线程同步与互斥在多线程编程中,线程同步与互斥是两个非常重要的概念,它们用于控制多个线程对共享资源的访问,以避免数据竞争、死锁等问题。
互斥量是一种同步原语,用于防止多个线程同时访问共享资源。当一个线程需要访问共享资源时,它首先需要锁定(lock)互斥量。如果互斥量已经被其他线程锁定,那么请求锁定的线程将被阻塞,直到互斥量被解锁(unlock)。
std::mutex:用于保护共享资源,防止数据竞争。
std::mutexmtx;mtx.lock();//锁定互斥锁//访问共享资源mtx.unlock();//释放互斥锁std::lock_guard和std::unique_lock:自动管理锁的获取和释放。
std::lock_guard
C++提供了多种锁类型,用于简化互斥量的使用和管理。
常见的锁类型包括:
锁的使用示例:
条件变量用于线程间的协调,允许一个或多个线程等待某个条件的发生。它通常与互斥量一起使用,以实现线程间的同步。
std::condition_variable用于实现线程间的等待和通知机制。
std::condition_variablecv;std::mutexmtx;boolready=false;std::unique_lock
原子操作确保对共享数据的访问是不可分割的,即在多线程环境下,原子操作要么完全执行,要么完全不执行,不会出现中间状态。
原子操作的使用示例:
线程局部存储允许每个线程拥有自己的数据副本。这可以通过thread_local关键字实现,避免了对共享资源的争用。
线程局部存储的使用示例:
死锁发生在多个线程互相等待对方释放资源,但没有一个线程能够继续执行。避免死锁的策略包括:
std::future和std::promise:实现线程间的值传递。
消息队列(基于std::queue和std::mutex)实现简单的线程间通信。
C++17引入了并行算法库(