后台开发核心技术(11):多线程

背景介绍

进程:以前,进程是最小的执行单位。进程是包含程序指令和相关资源的集合,每个进程和其他进程一起参与调度,竞争CPU、内存等资源。每次进程的切换,都存在着进程资源的保存和恢复动作,这称为上下文切换。
发现问题:比如一个简单的GUI程序,为了有更好的交互性,通常一个任务执行界面交互,一个任务进行后台计算。每个任务都由一个进程来实现,那么相当的低效!因为每个进程的系统资源都是独占的,比如内存空间。每一次切换,这些独立资源都需要切换,所以,演化出了——利用分配给同一个进程的资源,尽量实现多个任务的方法,这就是线程的概念。
同一个进程的多个线程,共享的是同一个进程的所有资源。

多线程

多线程就是允许一个进程内有多个控制权,从而让多个函数的操作同时运行,即使是单核的CPU的计算机,也可以通过不停地切换线程指令,从而造成多线程同时运行的效果!
栈:一个进程有其栈空间,就是执行函数的地址空间,一个栈中只有最下方的帧可被读,也就是只有该帧对应的函数被激活!所以多线程与栈密切相关,如果想实现多线程必须绕开一个栈的限制!——所以,在创建一个新的线程的时候,需要为这个线程创建新的栈,每个栈对应一个线程,当某个栈全部弹出时,这个线程完成任务。所以多线程存在多个栈,每个栈之间有空白区隔开,以备栈增长,对于多线程来说,任何一个栈的空白区域被填满都会导致栈溢出。

多线程同步

上面提了多线程的作用,优点,就是共享一个进程的内存等资源,以免去了频繁切换内存地址和指令的消耗,同时多个线程共享一个资源有时候会造成冲突!多线程的同步问题就产生了。有几种策略处理这种问题:

1、互斥锁
2、条件变量
3、读写锁
4、信号量

在后面文章中总结操作系统有关知识会着重说明其中的细节。

线程的创建与结束例子

#include<stdio.h>
#include<pthread.h>
void *say_hello(void* args)
{
   // 线程的运行函数,必须 void* ,没说的表示返回通用指针
   printf("hello from thread\n");
   pthread_exit((void*)1);
}

int main()
{
   pthread_t tid;
   int iRet = pthread_create(&tid,NULL,say_hello,NULL);
   // 参数依次是:创建线程的id,线程参数,调用函数名,传入的函数参数
   if(iRet)
   {
   printf("pthread_create error: iRet=%d\n",iRet);
   return iRet;
   }
   void *retval;
   iRet=pthread_join(tid,&retval);
   if(iRet)
   {
   printf("thread_join error : iRet = %d\n",iRet);
   return iRet;
   }
   printf("retval = %ld\n",(long)retval);
   return 0;
 }

~bye

热门文章

暂无图片
编程学习 ·

HTTP权威指南------1.1HTTP概述

HTTP权威指南------HTTP概述HTTP概述C/S媒体类型URIURLURN事务方法状态码报文连接版本历程Web的结构组件代理缓存网关隧道用户代理 HTTP概述 HTTP是可靠数据传输协议,其传输过程确保数据的完整正确,无需进一步关注传输过程的控制。 C/S 客户端与服务器架构,服务器存储相应的…
暂无图片
编程学习 ·

C语言 介绍

一.C的历史 编程语言的发展过程: 第1代语言 机器语言↓ 第2代语言 汇编语言↓ 第3代语言 高级语言——结构化:C,Fortran,Basic,Pascal↓分界线:1980s面向对象(OO):Algo,Simula67,Ada,SmallTalkC++,Java,C#结构化语言的缺陷: 操作和数据是分离的C语言的起源: 1969…
暂无图片
编程学习 ·

大数据运维-监控可视化需求构建总结

1 数据源需求1.1 主动接入需求来源:某些市场银行1.1.1 API 接入能力要求 支持请求授权接入。(auth 认证)支持数据快速获取测试验证。支持数据依赖的参数引用。支持全量、增量同步(日、时、分、秒)支持多层级解析 (目前按JSON格式处理) 1.1.2 SDK接入能力要求 支持快速集…
暂无图片
编程学习 ·

Android中给Layout添加点击事件

@Android中给Layout添加点击事件 步骤一:在layout控件中设置clickable和focuseable和id <LinearLayout android:id="@+id/to_anchor_dialog" android:onClick=“onClick” android:clickable=“true” android:layout_width=“match_parent” android:layout_hei…
暂无图片
编程学习 ·

springboot+Netty搭建web服务器实现物联网温湿度采集

前言:这段时间做了一个课程设计,内容是将温湿度传感器采集到的温湿度数据上传到web服务器并以表格或者折线图的方式可视化展示出来。 话不多说:上代码 ①Netty服务器搭建 NettyServer.java /*** @author cx* @Time 2020/6/29 22:00* @Description netty 服务器配置*/ public…
暂无图片
编程学习 ·

jetson测试多个CSI摄像头(python版)

首先,CSI摄像头和USB摄像头的调用方式是不一样的。 遇到过的错误 linano@jetson-nano$:python3 mpy-Copyl.py [ WARN:0 ] qlobal /home/nvidia/host/build opencv/nv opencv/modules/videoio/src/cap qstreamer. Cpp (1757) handleMessage OpenCV | GStreamer warninq: Embedd…
暂无图片
编程学习 ·

写代码不得不看系列

在电脑上发现以前保存的一段脚本#!/bin/bashfor sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do(syspath="${sysdevpath%/dev}"devname="$(udevadm info -q name -p $syspath)"[[ "$devname" == "bus/"* ]] &&a…
暂无图片
编程学习 ·

ECharts雷达图详细配置说明

// 指定图表的配置项和数据 var option = {backgroundColor: rgba(204,204,204,0.7 ),// 背景色,默认无背景 rgba(51,255,255,0.7)title: {text: 各教育阶段男女人数统计,link: https://www.xxx.com,target: blank,top: 5%,left: 3%,textStyle: {color: #fff,fontSize: 20,…
暂无图片
编程学习 ·

3D体验平台---PEVR软件

3D体验平台---PEVR软件背景概述产品介绍优势及亮点官网**公司背景**pevr实机画面 背景概述 pevr设计的出发点是为通用的3D互动软件和简单3D游戏的开发提供一个平台,它集成了3D互动所需的各种触发类型机制,以及各种类型的响应功能。同时允许使用者自行摆放触发,并编辑触发的响…
暂无图片
编程学习 ·

IntelliJ IDEA中使用markdown画流程图

安装 Scene Builder下载安装:https://gluonhq.com/products/scene-builder/ 中 Download Scene Builder for Java 8IntelliJ IDEA -> Preferences -> Languages and Frameworks -> JavaFX 中的 "Path to SceneBuilder" 设置为 "/Applications/SceneBu…
暂无图片
编程学习 ·

遗传算法求解TSP问题python实现

文章目录1 遗传算法总体设计2 算子设计2.1 选择算子2.2 交叉算子2.3 变异算子2.4 将种群的个体按照里程排序,并返回当前种群中的最优个体及其里程2.5 设置种群数,变异概率及其进化次数2.6 主函数3 实验结果分析4 附python源码(完整版) 1 遗传算法总体设计Step1: 初始化参数(…
暂无图片
编程学习 ·

SpringMVC框架的详细操作步骤和注解的用法

springMVC操作步骤: 第一步:导入jar(spring4个核心+日志+spring-web+spring-webmvc+spring-aop) 第二步:在web.xml中配置前端控制器(servlet),并读取springmvc的资源文件springmvc.xml<servlet><servlet-name>springDispatcherServlet</servlet-name><ser…
暂无图片
编程学习 ·

Java 语言中关键字“static”的理解和应用详解

接触Java编程语言的初学者们,都是熟悉static这个关键词的,至少混个脸熟了已经。涉及到它的概念、或解释,我们都是知道它表示“静态”、甚至了解“静态存储区”。它可以应用到:属性 方法 代码块 还可以做“静态导入” 内部类 一、static修饰的属性,我们亦称之为“静态变量”…
暂无图片
编程学习 ·

第4章 一般概念

一、名称空间std 1.namespace具有可扩展开放性,可发生于任何源码文件上。 2.欲使用C++标准库的任何东西,有三种选择: (1)直接指定标识符。如std::cout (2)使用using declaration。如:using std::cout (3)使用using directive。如using namespace std; 注意:在复杂的…
暂无图片
编程学习 ·

python隐秘的角落——笛卡尔之心

随着网剧《隐秘的角落》的热播,让法国数学家、哲学家笛卡尔重回大众视野,他的心形线也在剧情中抢尽风头。 在隐秘的角落剧中,少年宫奥数老师张东升,在课上给同学们讲了这么一个故事: 数学家笛卡尔流落到瑞典,邂逅了美丽的公主克里斯蒂娜。国王知道了这件事后,强行拆散了…
暂无图片
编程学习 ·

centos 怎么安装 nginx

linux centos 7 安装 nginx 原文来自官网 : http://nginx.org/en/linux_packages.html Installation instructions Before you install nginx for the first time on a new machine, you need to set up the nginx packages repository. Afterward, you can install and updat…
暂无图片
编程学习 ·

详解Kafka设计架构核心——Kafka副本机制详解

本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等所谓的副本机制(Replication),也可以称之为备份机制,通常是指分布式系统在多台网络互联的机器上保存有相同的数据拷贝。副本机制有什么好处呢? 1. 提供数据冗余。即使系统部分组件失效,系统依然能够继…
暂无图片
编程学习 ·

字符串按固定长度分割

字符串分隔题目描述•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。输入描述:连续输入字符串(输入2次,每个字符串长度小于100)输出描述:输出到长度为8的新字符串数组示例1输入abc 123456789…