C++多线程 并行与并发 了解进程和线程 浅显的进行传参,调用

简介: C++多线程 并行与并发 了解进程和线程 浅显的进行传参,调用

导航


1.了解并行与并发的概念

2.了解进程和线程

3.浅显的进行传参,调用


——————————————————————————————————————


多线程程序包含可以同时运行的两个或多个部分。这样的程序中的每个部分称为一个线程,每个线程定义了一个单独的执行路径。


基于进程和基于线程:


基于进程的多任务处理是程序的并发执行。

基于线程的多任务处理是同一程序的片段的并发执行。


头文件#include < thread>


1.了解并行与并发的概念:


并行:两个或多个事件在同一时刻发生(同时发生)

并发:两个或多个事件在同一时间段发生



2.了解进程和线程:


进程:正在运行的程序,比如你打开了qq和微信就是两个进程

线程:进程内部的执行单元,比如谷歌浏览器打开了多个页面

多线程:多个线程并发执行




1个进程可以包含多个线程


创建线程,获取线程的id号:


#include <iostream>
#include <thread>
using namespace std;
void func()
{
  //this_thread::get_id  获取线程的id
  cout<<"this is my thread,thread is"<<this_thread::get_id<<endl;
}
int main()
{
  thread th = thread(func);
  th.join();    //用来等待被创建线程的结束,并回收它的资源
  cout<<"this is main thread,this thread is"<<this_thread::get_id<<endl;
  system("pause");
  return 0;
}



也可以进行传参:


#include <iostream>
#include <thread>
#include <string>
using namespace std;
void func(string s)
{
  //this_thread::get_id  获取线程的id
  cout<<"this is my thread,thread is "<<s<<endl;
}
int main()
{
  thread th = thread(func,"c++");   //将传入的参数放入其中
  th.join();    //用来等待被创建线程的结束,并回收它的资源
  cout<<"this is main thread"<<endl;
  system("pause");
  return 0;
}



如果传的是引用的话:


#include <iostream>
#include <thread>
#include <string>
using namespace std;
void func(string& s)
{
  cout<<(&s)<<endl;  //打印下地址
  cout<<"this is my thread,thread is "<<s<<endl;
}
int main()
{
  string ss = "c++";
  thread th = thread(func,std::ref(ss));  //后面传参数也要规范
  th.join();    //用来等待被创建线程的结束,并回收它的资源
  cout<<"this is main thread"<<endl;
  cout<<(&ss)<<endl;
  system("pause");
  return 0;
}



运行:



——————————————————————————————————————


可以传多个参数:


#include <iostream>
#include <thread>
using namespace std;
void func(int a,int b)
{
  cout<<a+b<<endl;
}
int main()
{
  thread th = thread(func,1,2);  //后面可以传多个参数
  th.join();    //用来等待被创建线程的结束,并回收它的资源
  system("pause");
  return 0;
}


运行结果:3


——————————————————————————————————————


同一个时间段运行,或者一个线程运行完之后再运行下一个


#include <iostream>
#include <thread>
using namespace std;
class theod
{
public:
  void operator()(int limit) //运算符重载,仿函数
  {
  for(int i=0;i<limit;i++)
  {
    cout<<i<<endl;
  }
  }
};
int main()
{
  thread th = thread(theod(),88);  //调用类内仿函数,参数写在旁边
  //th.join();   //如果放在上面时会等待线程结束后再进行运行下面for循环
  for(int i=0;i<88;i++)
  {
  cout<<"i am a:"<<endl;
  }
  th.join();    //join()写在下面时,main函数中的线程与调用函数那个线程会同个时间段进行运行,而不是依次
  system("pause");
  return 0;
}



不懂的


#include <iostream>
#include <thread>
#include <string>
using namespace std;
int main()
{
  string z = "test";
  thread f = thread([&z](int a,int b){
  cout<<z<<endl;
  cout<<a+b<<endl;
  },2,3);
  f.join();
  system("pause");
  return 0;
}
相关文章
|
10月前
|
Java 测试技术 API
【JUC】(1)带你重新认识进程与线程!!让你深层次了解线程运行的睡眠与打断!!
JUC是什么?你可以说它就是研究Java方面的并发过程。本篇是JUC专栏的第一章!带你了解并行与并发、线程与程序、线程的启动与休眠、打断和等待!全是干货!快快快!
1236 2
|
10月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
442 1
|
10月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
414 1
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
694 13
|
Web App开发 运维 监控
深入探索Linux命令pwdx:揭秘进程工作目录的秘密
`pwdx`命令在Linux中用于显示指定进程的工作目录,基于`/proc`文件系统获取实时信息。简单易用,如`pwdx 1234`显示PID为1234的进程目录。结合`ps`和`pgrep`等命令可扩展使用,如查看所有进程或特定进程(如Firefox)的目录。使用时注意权限、进程ID的有效性和与其他命令的配合。查阅`man pwdx`获取更多帮助。
1140 118
|
Linux 数据库 Perl
【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉
本文来自YashanDB官网,探讨Linux系统中OOM Killer对数据库服务器的影响及解决方法。当内存接近耗尽时,OOM Killer会杀死占用最多内存的进程,这可能导致数据库主进程被误杀。为避免此问题,可采取两种方法:一是在OS层面关闭OOM Killer,通过修改`/etc/sysctl.conf`文件并重启生效;二是豁免数据库进程,由数据库实例用户借助`sudo`权限调整`oom_score_adj`值。这些措施有助于保护数据库进程免受系统内存管理机制的影响。
|
Linux Shell
Linux 进程前台后台切换与作业控制
进程前台/后台切换及作业控制简介: 在 Shell 中,启动的程序默认为前台进程,会占用终端直到执行完毕。例如,执行 `./shella.sh` 时,终端会被占用。为避免不便,可将命令放到后台运行,如 `./shella.sh &`,此时终端命令行立即返回,可继续输入其他命令。 常用作业控制命令: - `fg %1`:将后台作业切换到前台。 - `Ctrl + Z`:暂停前台作业并放到后台。 - `bg %1`:让暂停的后台作业继续执行。 - `kill %1`:终止后台作业。 优先级调整:
1677 5
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
814 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)

热门文章

最新文章