每日C++

每日C++,第1张

每日C++ 并发,进程线程基本概念 并发

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

进程

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

线程

每个进程,都有一个主线程,并且主线程是唯一的,也就是一个进程只有一个主线程。
当你执行一个可执行程序,产生一个进程后,这个主线程就随着一个进程启动起来了。
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 来接收

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5594657.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存