两个或者多个独立的活动同时进行的现象称为并发。并发可以简单的认为,可以理解成多个应用程序同时运行。在单核CPU中,并发实际上是一种假象,进程之间实际上是按照一定的分配算法轮流使用CPU。
并发的实现主要有两种方式:
1.多进程实现并发
2.单个进程,多个线程实现并发,就是一个主线程多个子线实现。
#include
#include
using namespace std;
void print(){cout<<"子线程在运行。。。"<//创建线程thread t1(print);//print为线程处理函数cout<<"主线程。。。"<
运行结果:
可以看到,主线程和子线程的运行顺序是不一样的,在其他的编译器中,可能不会出现“子线程在运行。。。”的语句。
可以利用 join 函数加入,汇合线程,阻塞主线程。添加以后等线程运行结束之后才运行主线程。注意 一个线程只能join一次,不能重复。
#include
#include
#include
using namespace std;
//线程处理函数
void print(){Sleep(2000);//休眠2scout<<"子线程在运行..."<//创建线程thread t1(print);t1.join();//阻塞 ,添加以后等线程运行结束之后才运行主线程cout<<"主线程..."<
detach( ) 函数用于打破主线程和子线程之间的依赖关系,将子线程和主线程之间进行分离,不影响。
detach后,就不能再join
void print(){Sleep(2000);//休眠2scout<<"子线程在运行..."<//创建线程thread t1(print);t1.detach();//子线程与主线程分离cout<<"主线程..."<
joinable( ) 函数是一个布尔类型的函数,他会返回一个布尔值来表示当前的线程是否是可执行线程(能被join或者detach),因为相同的线程不能join两次,也不能join完再detach,同理也不能detach,所以joinable函数就是用来判断当前这个线程是否可以joinable的。
#include
#include
using namespace std;
void print(){cout<<"子线程在运行。。。"<thread t1(print);t1.join();cout<<"主线程..."<
创建线程的方式根据线程处理函数的不同,一共可以分成6种。
不带参数的普通函数作为线程处理函数。
#include
#include
using namespace std;
void print(){cout<<"子线程在运行。。。"<//创建线程thread t1(print);//print为线程处理函数cout<<"主线程。。。"<
利用类中的仿函数作为线程处理函数。
#include
#include
using namespace std;
class A{//STL 仿函数 类名模仿函数的行为void operator()(){cout<<"子线程..."<//正常写法1 对象充当线程处理函数A a;thread t1(a);t1.join();//写法2
// thread t1((A()));
// t1.join();cout<<"主线程..."<
Lambda表达式简单地说,就是将函数定义和调用放在一处实现。
#include
#include
using namespace std;
int main(){thread t1([]{cout<<"子线程调用..."<
将带参数的函数作为线程处理函数。
#include
#include
using namespace std;
void p1(int &n){cout<<"子线程"<int n=0;thread t3(p1,std::ref(n));//ref用于包装引用传值t3.join();thread t31(p1,std::ref(n));t31.join();cout<<"主线程..."<
就是以智能指针为参数的函数作为线程处理函数
void p2(unique_ptr ptr){cout<<"子线程:"<//智能指针为参数的线程处理函数int *p=new int(12);cout<<*p< ptr(new int(1000));cout<<"主线程:"<
将类的成员函数作为线程处理函数
class B{
public:void p3(int &num){num=1100;cout<<"子线程id:"<//类的成员函数充当线程处理函数B b;int num=10;//需要告诉是哪一个对象的成员函数thread t5(&B::p3,b,ref(num));//注意创建thread类对象的方式t5.join();cout<<"主线程id: "<