如何生成构架图(结构图生成)
761
2022-05-30
目录
一、概念
二、线程实现
1、创建并运行
2、共同操作数据示例
3、互斥对象mutex
4、带参线程
一、概念
先了解一下进程,进程是系统中程序执行和资源分配的基本单位。每个进程有自己的数据段、代码段和堆栈段。
而线程通常叫做 “轻量级进程”,一个进程可以有多个线程,它和同进程中的其他线程共享进程空间(堆代码、数据、文件描述符、信号等),只拥有自己的栈空间,关系如下图示例。
线程也主要呈现三种状态:运行态、阻塞态、就绪态。
在同一个进程下,每个线程都有独立的ID,一般用tid表示。
二、线程实现
在c++11引入了一个多线程类std::thread,使用时需包含头文件
示例编译:g++ -std=c++11 -pthread thread.cpp -o thread
1、创建并运行
(1) 写一个普通函数,用来给线程执行
void t1(void){ for(int i=0;i<10;i++){ cout<<"this is thread1 + "<
(2)创建线程
thread thread1(t1);//创建
但是,创建之后线程不会立即运行,只有在join或detach指定运行方式之后才能运行。
(3)join或detach
#include 运行结果: join方式 可以看到创建线程之后,子线程没有立即执行,但主线程执行了①,在join之后,可以看出,子线程运行了②,但主线程没有运行,直到子线程结束之后,主线程才执行了③。 因为join会使主线程阻塞,运行子线程,等到子线程结束,主线程才会继续运行。如下图所示。 detach方式 这时可以发现,使用detach方式之后,子线程的输出和主线程的输出会有重合的现象,并且,子线程明显没有完全执行完。 因为detach是一种让主线程和子线程并行运行的方式,并且主线程不会等到子线程执行完才结束,主线程运行结束,同时会连带着杀死子线程。如下图所示。 2、共同操作数据示例 #include 两个线程可以共同操作变量a,运行结果: 但这是加入sleep规定了顺序,如果不加,输出会出现错误,极端情况下,a的值可能会重复输出,如下图所示。 这时可以使用互斥对象来避免。 3、互斥对象mutex 使用mutex需要包含头文件 int a=0; mutex mu; void t1(void){ for(int i=0;i<5;i++){ mu.lock(); cout<<"this is thread1 + "< 加入mutex运行结果: 4、带参线程 thread 线程名(线程函数名,参数列表); #include 运行结果: IoT Unix C++
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。