笔记_线程概念_多进程并发_Detach()

14 篇文章 0 订阅

并发,进程,线程基本概念

并发

两个或者多个任务同时发生,一个程序同时执行多个独立任务

进程

一个可执行程序运行起来了,就创建一个进程

线程

每个进程,都有一个主线程,并且主线程是唯一的,也就是一个进程只有一个主线程。
当你执行一个可执行程序,产生一个进程后,这个主线程就随着一个进程启动起来了。
F5运行的时候,进程的主线程来调用main函数的代码
线程,代码的执行通路。
除了主线程外,可以通过自己写代码来创建其他线程,其他线程是走别的地方
每创建一个新的线程,就可以在同一时刻,多干一个不同的事情

多线程

线程并不是越多越好,每个线程,就需要一个独立的堆栈空间,线程之间切换要保存很多中间状态

并发的实现方法

1)多个进程实现并发
2)在单独进程中,创建多个线程来实现并发,自己写代码来创建除了主线程之外的其他线程

多进程并发

相同电脑进程之间通信(管道,文件,消息队列,共享内存)
不同电脑:Socket通信技术

多线程并发

单个进程中创建多个线程
每个线程都有自己独立的运行路径,但是一个进程中多个线程都是共享地址空间(内存的)
全局变量,指针,引用都可以在线程中传递,所以使用多线程开销远远小于多进程

总结


线程启动更快,更轻量级
系统资源开销更少,执行更快,共享内存比其他任何通信方式都快
缺点是使用难度高,小心处理数据一致性

写线程

包含头文件thread

void myprint()
{
    cout << "1111" << endl;
    cout << "2222" << endl;
}
int main()
{
    
    thread mythe(myprint);//创建了线程,线程执行的入口,myprint(),这个myprint线程开始执行
    mythe.join();//加入汇合,阻塞主线程,让主线程等待子线程执行完毕,然后两个汇合。主线程往下走
    cout << "end" << endl;
    return 0;
}

Detach()

传统多线程主线程要等待至子线程执行完毕,然后自己最后退出
分离:主线程不与子线程汇合,各自执行,互不影响。
创建了多个子线程,让主线程逐个等待子线程结束。但是这个方法并不太好,应该逐个等待。
这个子线程相当于被c++运行时刻接管,当这个子线程执行完后,由运行时库清理相关资源。
一旦用detach 不能join

joinable()
如果能join或者detach

类对象(可调用对象)创建线程

class TA
{
public:
    void operator()()
    {
        cout << "111" << endl;
        cout << "2222" << endl;
    }
};
int main()
{
    TA tt;
    thread mythe(tt);//创建了线程,线程执行的入口,myprint(),这个myprint线程开始执行
    mythe.join();//加入汇合,阻塞主线程,让主线程等待子线程执行完毕,然后两个汇合。主线程往下走
    cout << "end" << endl;
    return 0;
}

传递临时对象作为线程参数

指针传递在detach中一定会有问题,因为地址是一致的,不知何时线程会销毁这个变量。
char[] 传递时,可以用string &str 来接收

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值