C++线程创建的方式和使用
创始人
2024-01-27 02:03:34
0

进程与线程

  • 进程
    简单的可以认为是一个程序执行的过程。进程就是活跃的程序,在内存中运行,占用系统的资源。
  • 线程
    线程也叫轻量级进程,通常一个进程包含若干个线程。线程可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,比如我们在利用微信聊天的同时,也可以和别人文字聊天。

并发

两个或者多个独立的活动同时进行的现象称为并发。并发可以简单的认为,可以理解成多个应用程序同时运行。在单核CPU中,并发实际上是一种假象,进程之间实际上是按照一定的分配算法轮流使用CPU。
并发的实现主要有两种方式:
1.多进程实现并发
2.单个进程,多个线程实现并发,就是一个主线程多个子线实现。

C++中创建线程的方式

  • 头文件 #include
  • 创建线程:调用 thread 类去调用一个线程的对象
#include
#include
using namespace std;
void print(){cout<<"子线程在运行。。。"<//创建线程thread t1(print);//print为线程处理函数cout<<"主线程。。。"<

运行结果:
在这里插入图片描述
可以看到,主线程和子线程的运行顺序是不一样的,在其他的编译器中,可能不会出现“子线程在运行。。。”的语句。

join( )函数

可以利用 join 函数加入,汇合线程,阻塞主线程。添加以后等线程运行结束之后才运行主线程。注意 一个线程只能join一次,不能重复。

#include
#include
#include
using namespace std;
//线程处理函数
void print(){Sleep(2000);//休眠2scout<<"子线程在运行..."<//创建线程thread t1(print);t1.join();//阻塞 ,添加以后等线程运行结束之后才运行主线程cout<<"主线程..."<

detach( )函数

detach( ) 函数用于打破主线程和子线程之间的依赖关系,将子线程和主线程之间进行分离,不影响。
detach后,就不能再join

void print(){Sleep(2000);//休眠2scout<<"子线程在运行..."<//创建线程thread t1(print);t1.detach();//子线程与主线程分离cout<<"主线程..."<

joinable( )函数

joinable( ) 函数是一个布尔类型的函数,他会返回一个布尔值来表示当前的线程是否是可执行线程(能被join或者detach),因为相同的线程不能join两次,也不能join完再detach,同理也不能detach,所以joinable函数就是用来判断当前这个线程是否可以joinable的。

#include
#include
using namespace std;
void print(){cout<<"子线程在运行。。。"<thread t1(print);t1.join();cout<<"主线程..."<

创建线程的方式

创建线程的方式根据线程处理函数的不同,一共可以分成6种。

1.不带参的方式创建线程

不带参数的普通函数作为线程处理函数。

#include
#include
using namespace std;
void print(){cout<<"子线程在运行。。。"<//创建线程thread t1(print);//print为线程处理函数cout<<"主线程。。。"<

2.通过类和对象创建线程

利用类中的仿函数作为线程处理函数。

#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<<"主线程..."<

3.通过Lambda表达式创建线程

Lambda表达式简单地说,就是将函数定义和调用放在一处实现。

#include
#include
using namespace std;
int main(){thread  t1([]{cout<<"子线程调用..."<

4.带参的方式创建线程

将带参数的函数作为线程处理函数。

#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<<"主线程..."<

5.智能指针的方式创建线程

就是以智能指针为参数的函数作为线程处理函数

void p2(unique_ptr ptr){cout<<"子线程:"<//智能指针为参数的线程处理函数int *p=new int(12);cout<<*p< ptr(new int(1000));cout<<"主线程:"<

6.类的成员函数创建线程

将类的成员函数作为线程处理函数

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: "<

相关内容

热门资讯

埃及电信大楼失火致伤22人 开...   埃及首都开罗市一座电信大楼7日晚发生火灾,导致22人受伤,大开罗地区的移动通信和互联网服务大面积...
网上创业时代平台公司 互联网最... 互联网创业项目网站乡镇最适合的创业项目创业平台有哪些正规创业平台有哪些个人创业项目大全没人注意的暴利...
南宁创业项目 南宁创业项目 南... 创业小项目创业项目推荐低成本创业项目自己在家创业项目适合创业项目小型创业项目南宁招聘网新型创业项目南...
南宁20205g时代创业项目网... 创业小项目创业项目推荐低成本创业项目自己在家创业项目适合创业项目小型创业项目南宁招聘网新型创业项目南...
致富好选择,面膜加盟是不错的商... 好315创业商机网下载全国免费代理商加盟中国创业网创业网站好项目创业网加盟创业义乌找长期合作加工厂招...
北京适合年轻人的创业好项目排名... 中国合伙创业网找合伙人创业创业中国人加盟项目义乌找长期合作加工厂在北京投资什么比较好创业交流平台20...
北京最北京创业靠谱的那些创业项... 中国合伙创业网找合伙人创业创业中国人加盟项目义乌找长期合作加工厂在北京投资什么比较好创业交流平台20...
8个适合年轻人投资创业的好项目... 小额投资有哪些好项目2021年投资项目21年创业好项目小额创业有哪些好项目小额投资创业好项目前十排名...
网上创业新项目 58创业好项目... 创业找项目58创业好项目返乡创业项目创业项目选择小本创业首选项目中小创业项目有什么小本创业好项目创业...
绵阳创业小本项目 绵阳创业小本... 创业小项目 个人创业加盟创业小投资项目创业小项目小成本创业好项目有哪些一千元投资创业小项目适合创业的...