C++之多线程编程

article/2025/9/16 5:48:46

一、并发的实现

        1.多进程并发主要解决进程间通信的问题

                ①同一电脑上:管道、文件、消息队列、内存共享。

                ②不同电脑上:socket网络通信。

        2. 单进程中的多个线程并发(一个主线程+多个子线程实现并发)

                ①一个进程中的所有线程共享内存空间 eg:全局变量,指针引用

二、线程的多种创建方式

 1. 调用thread类去创建线程对象

        头文件和子线程处理函数(以下所有代码段共用):

#include<iostream>
#include<thread>
#include<windows.h>
using namespace std;//线程处理函数
void print() {Sleep(3000);cout << "子线程运行喽........" << endl;
}

                注:如果创建一个线程而不做处理,会调用abort函数中止程序

                        一个线程只能join一次,否则也会abort。

        1.1. 使用join()函数加入,汇合线程,阻塞主线程,等待子进程执行结束,才会回到主线程

int main(){//创建线程thread test1(print);test1.join();        //阻塞(若test1线程未执行完,则主线程不会打印)cout << "主线程运行喽........." << endl;
}

运行说明:三秒后依次打印出

 

1.2. 使用detach()函数,打破依赖关系,把子线程驻留后台

        注:线程detach后,就不能在join了 

int main(){//创建线程thread test1(print);test1.detach();cout << "主线程运行喽........." << endl;
}

运行说明:直接只打印出:

 

1.3 使用joinable()函数判断当前线程是否可以做join或者detach操作,若可以,返回true。

int main(){//创建线程thread test1(print);test1.detach();cout << "主线程运行喽........." << endl;if (test1.joinable())test1.join();elsecout << "该子线程已经被处理啦....." << endl;
}

运行说明:

 

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

class Li {
public://STL仿函数void operator()() {cout << "子线程启动喽....." << endl;}
};
int main(){//正常写法:对象充当线程处理函数Li li;thread test1(li);test1.join();Li(); //无名对象thread test2((Li()));   //这里如果不多写一个括号,编译器就会把test2解析成一个函数,Li()解析成一个参数,从而出错test2.join();}

运行:

 

3. 带参的方式创建线程

//传引用可以改变num的实际值
void printInfo(int& num) {cout << "子线程运行喽...." << endl;
}
int main(){int num = 0;//ref 用于包装 “引用传递值” thread test1(printInfo, ref(num));test1.join();cout << "我是主线程...." << endl;}

运行:

4. Lambda表达式创建线程

int Max(int a, int b) {return a > b ? a : b;
}
int main(){int (*pMax)(int, int) = nullptr;pMax = [](int a, int b)->int {return a > b ? a : b; };[] {cout << "helloword" << endl; }();cout << pMax(3, 5) << endl;thread test1([] {cout << "我是子线程..." << endl; });test1.join();cout << "我是主线程..." << endl;return 0;
}

运行:

 

5. 以智能指针为参数创建线程

void print(unique_ptr<int> ptr) {cout << "我是子线程:" << ptr.get()<<endl;
}
int main(){int* p = new int(100);unique_ptr<int> ptr(p);cout << "我是主线程:" << ptr.get() << endl;thread test1(print, move(ptr)); //move移动语义,通俗的说就是把ptr移动到子线程中了,这样的话,主线程中的ptr就没了    test1.join();cout << "我是主线程:" << ptr.get()<<endl;}

运行:

 

6. 以类的成员函数充当线程处理函数来创建线程

class Li {
public:void print(int& num) {num = 1001;cout << "我是子线程:" << this_thread::get_id() << endl;}
};
int main(){Li li;int num = 1007;//需要说明 是哪个对象thread test1(&Li::print,li,ref(num));test1.join();cout << "我是主线程:" << this_thread::get_id()<<endl;}

运行:

 


http://chatgpt.dhexx.cn/article/PXwK1tu3.shtml

相关文章

Springboot异步多线程编程

文章目录 一、基础知识二、什么时候用同步&异步三、什么时候需要使用多线程四、springboot异步多线程编程实现 一、基础知识 同步&#xff1a;同步就是指一个进程在执行某个请求的时候&#xff0c;若该请求需要一段时间才能返回信息&#xff0c;那么这个进程将会一直等待下…

【线程】多线程编程

目录 一、概念 1.进程与线程的区别是&#xff1f;&#xff08;常问&#xff09; 2.线程与fork系统调用 3.线程的优缺点 4.线程的实现方式 二、线程函数 1.pthread_create 2.pthread_exit 3.pthread_join 4.pthread_cancel 三、线程的使用 1.线程的基本操作 2.并发…

多线程编程及线程间通信机制

对进程线程的印象还是比较好的,这对于学习C高级的朋友是非常重要的,怎样更快的学习到线程的具体使用呢?最好的办法自然是练习再练习,然后还要看很多的代码才是,之前又听说了一个IT同行过劳死,特别的提醒广大的IT从业者,要注意合理的作息习惯,健康才是最重要的,下面结合…

多线程编程

多线程指的是一个程序中包含两个或者两个以上的线程&#xff0c;多线程的提出是为提高代码的执行效率&#xff0c;这就好比工厂中的流水线&#xff0c;只有一条称为单线程&#xff0c;有多条流水线就称为多线程。多线程提高效率的同时由于并发执行的不确定性&#xff0c;导致出…

两种 C++ 多线程编程方式,看完不懂打我...

多线程在实际编程中的重要性不言而喻&#xff0c;对 C 而言&#xff0c;当我们需要使用多线程时&#xff0c;有多种方案可供选择。比如 POSIX 线程 pthread、boost::thread 库、C11 开始支持的 std::thread 库&#xff0c;以及其他一些第三方库 libdispatch&#xff08;GCD&…

ARP攻击模拟工具

以下是本人平时的一些小作品&#xff0c;特此和大家一起分享... ARP攻击模拟工具 第一代 说明&#xff1a; 实现模拟以太网的ARP欺骗攻击和IP地址冲突攻击。 此为本人早期作品&#xff0c;固比较简陋和不完善&#xff0c;漏洞及错误之处可能较多请多多包涵&#xff01; 开发环…

ARP断网攻击

在之前的文章当中&#xff0c;我已经向大家介绍了关于ARP的欺骗原理。再进一步&#xff0c;将其中的原理运用到实战中去&#xff0c;又会有什么效果呢&#xff1f;ARP又可以给我们带来哪些具体的作用呢&#xff1f;毕竟实践要来支撑&#xff0c;我们之前学过的ARP欺骗原理。 我…

ARP-欺骗攻击

测试环境&#xff08;kali:192.168.189.7 win7:192.168.189.6 网关:192.168.189.2&#xff09; arpspoof -i eth0 -t 192.168.189.6 192.168.189.2 &#xff08;目标地址网关地址&#xff09; 接收获取的信息 随意登陆一个网站&#xff0c;可发现用户名及密码已被获取。可以…

ARP攻击原理及解决方法,很实用

故障原因】 局域网内有人使用ARP欺骗的木马程序&#xff08;比如&#xff1a;传奇盗号的软件&#xff0c;某些传奇外挂中也被恶意加载了此程序&#xff09;。 【故障原理】 要了解故障原理&#xff0c;我们先来了解一下ARP协议。 在局域网中&#xff0c;通过ARP协议来完成I…

ARP攻击怎么解决最安全

ARP攻击是指攻击者通过伪造网络中的ARP协议数据包&#xff0c;欺骗其他计算机的网络通信&#xff0c;从而实现中间人攻击等目的。 下面是ARP攻击的解决方法&#xff1a; 静态ARP表绑定MAC地址&#xff1a;在网络管理员的控制下&#xff0c;将主机的IP地址与MAC地址进行绑定&am…

ARP攻击及原理

ARP攻击原理:但凡局域网内存在arp攻击&#xff0c;说明网络存在“中间人” 1.PC1需要跟PC2通信&#xff0c;通过ARP请求包询问PC2的MAC地址&#xff0c;由于采用广播的形式&#xff0c;所以交换机会将ARP请求包从接口PC1广播到PC2和PC3。(注&#xff1a;交换机收到广播/组播/未…

ARP攻击、欺骗及防御

一、广播与广播域概述 1、广播与广播域 广播&#xff1a;将广播地址做为目的地址的数据帧。 广播域&#xff1a;网络中能接收到同一个广播所有节点的集合。 2、MAC地址广播 广播地址为FF-FF-FF-FF-FF-FF 3、IP地址广播 1&#xff09;255.255.255.255 2&#xff09;广播…

ARP攻击原理和kali实现ARP攻击

目录 一、ARP协议和ARP攻击1.ARP协议2.利用Wireshark分析ARP数据包3.ARP攻击 二、kali实现ARP攻击和ARP欺骗1.实验过程2.问题记录T_T 一、ARP协议和ARP攻击 1.ARP协议 ARP协议&#xff0c;地址解析协议&#xff08;Address Resolution Protocol&#xff09;&#xff0c;用来实…

怎么处理ARP攻击

ARP故障说明: ping 的时候可能好久才能接收到一个响应&#xff0c;或者说干脆就Ping不通。网络时好时坏&#xff0c;通过ARP -a命令不能看到同网段的在线用户&#xff0c;但是net view 可以看到全网开放共享的电脑名&#xff0c;这时候就需要注意了&#xff0c;可能是ARP攻击。…

网络安全--ARP攻击原理与防护

目录 一.ARP的原理 二.ARP攻击现象及危害 三.ARP攻击的原理 四.ARP防护 在局域网当中&#xff0c;有一个协议由于它的特性一旦遭受攻击就非常麻烦。首先是它的攻击门槛比较低&#xff0c;找到一些小工具就能实现攻击&#xff0c;而且危害极大。这个协议就是ARP协议。 ARP攻击是…

渗透技术——ARP攻击

Part 1: ARP攻击介绍 ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是一个位于TCP/IP协议栈中的底层协议&#xff0c;负责将某个IP地址解析成对应的MAC地址。而ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗&#xff0c;能够在网络中产生…

Linux操作系统及其发行版本

文章目录 Linux是什么Liunx与WindowsLinux的发行版本1. Debian系列&#xff1a;2. Slackware系列&#xff1a;3. Redhat系列&#xff1a;4. 其他发行版本&#xff1a; Linux是什么 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、…

linux查看系统版本命令

*一、查看Linux系统发行版本 * 命令1&#xff1a;lsb_release -a 该命令适用于所有Linux系统&#xff0c;会显示出完整的版本信息&#xff0c;包括Linux系统的名称&#xff0c;如Debian、Ubuntu、CentOS等&#xff0c;和对应的版本号&#xff0c;以及该版本的代号&#xff0c…

哪些是linux系统版本,linux系统主要有哪些版本

linux系统主要版本有&#xff1a;Redhat版本&#xff0c;基于RPM包的YUM包管理方式&#xff1b;2.CentOS版本&#xff0c;免费的、开源的、可以重新分发的linux发行版&#xff1b;3.Ubuntu版本&#xff0c;拥有漂亮的用户界面的系统&#xff1b;4.Mandriva版本&#xff0c;KDE桌…

Linux操作系统介绍及版本

1.1 认识Linux Linux操作系统是基于UNIX以网络为核心的设计思想&#xff0c;是一个性能稳定的多用户网络操作系统&#xff0c;Linux能运行各种工具软件、应用程序以及网络协议&#xff0c;它支持安装在32位和64位CPU硬件上。 通常来讲&#xff0c;Linux这个词只表示Linux内核&a…