并发编程/线程同步/线程同步深入/线程池/异步编程/Tas任务

2023-10-24 21:50

本文主要是介绍并发编程/线程同步/线程同步深入/线程池/异步编程/Tas任务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一:并发编程:

《1》:进程
通俗的讲,一个exe运行一次就会产生一个进程,一个exe的多个进程之间数据互相隔离。
1.一个进程里至少有一个线程:主线程。我们平时写的控制台程序默认就是单线程的,代码从上往下执行,一行执行完了再执行下一行;
2.什么是多线程:一个人一边烧水一边洗衣服比“先烧水再洗衣服”效率高。同一时刻一个人做多件件事情,只是在“快速频繁切换”,如果处理不当可能比不用多线程效率还低。讨论多线程先只考虑“单核cpu”。
3.普通的代码是从上向下执行的,但是多线程的代码可以“并行”执行,我们可以把“线程”理解成独立的执行单元,线程中的代码可以“并行执行”。线程根据情况被分配给一定的“时间片”来运行,可能一个线程还没执行完,就又要把时间片交给别的线程执行。把要在单独的线程放到一个方法中,然后创建 Thread 对象,运行它,这个 Thread 中的代码就会在单独的线程中执行。
4. 多线程的好处:有很大可能增加系统的运行效率;开发winform程序,避免界面卡;注册后向用户发送欢迎邮件,如果发送邮件很慢的话,避免注册过程很慢。
5. 线程默认是“非后台线程”,一个程序必须所有“非后台线程”执行结束后程序才会退出, 否则看起来好像是主线程退出了,其实进程还没有结束(搞一个winform 程序演示)把线程设置为“后台线程”后,所有“非后台线程”执行结束后程序就会退出,不会等“后台线程”执行结束:
thread.IsBackground = true;
简单的验证:控制台程序,如果不加 t1.IsBackground = true; 是线程执行结束才退出。加上的话就是“闪退”。

二:线程同步

《1》:定义:
线程同步问题就是解决多个线程同时操作一个资源的问题,多个线程对于资源的使用,必须等所有的线程使用完成之后再进行处理
while(th1.IsAlive);操作会大量消耗cpu空转,可以改成th1.Join()就是让当前线程等待th1线程的结束。

class Program{static int count = 0;   //定义一个变量static void Main(string[] args){//实例化一个线程对象用th1表示Thread th1 = new Thread(() =>{for (int i = 0; i < 10; i++){count++;Console.WriteLine("th1:" + count);Thread.Sleep(100);   //将当前线程挂起100ms}});th1.Start();   //线程的调用Thread th2 = new Thread(() =>{for (int i = 0; i < 10; i++){count++;Console.WriteLine("th2:" + count);Thread.Sleep(100);}});th2.Start();while (th1.IsAlive)    //获取当前线程执行状态的值并处于死循环{}while (th2.IsAlive){}Console.WriteLine(count);     //最终输出结果countConsole.ReadLine();}}

在这里插入图片描述

《2》:实现:
(1):Join
原理,等待耗时最长的线程执行完成之后在处理公共资源,给耗时最长的线程调用Join方法
(2):lock
改用lock解决多个线程同时操作一个资源。lock是C#中的关键字,他要锁定一个资源
lock的特点是:同时只能有一个线程进入lock的对象的范围,其他lock的线程就要等。

class Program{static int count = 0;    //定义一个静态的变量static Object o = new Object();    //新实例化一个静态的object对象static void Main(string[] args){Console.WriteLine(DateTime.Now.ToLongTimeString());//实例化一个线程对象用th1表示Thread th1 = new Thread(() =>{for (int i = 0; i < 10; i++){lock (o)    //同时只能有一个线程进入lock的对象的范围,其他lock的线程就要等。{count++;}Console.WriteLine("th1:" + count);Thread.Sleep(100);   //线程休眠时间100ms}});th1.Start();   //启动线程Thread th2 = new Thread(() => //Lambda表达式传值   实际上是构建了一个匿名函数 通过函数闭包来传值{for (int i = 0; i < 10; i++){lock (o){count++;}Console.WriteLine("th2:" + count);

这篇关于并发编程/线程同步/线程同步深入/线程池/异步编程/Tas任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/277995

相关文章

Java中如何正确的停掉线程

《Java中如何正确的停掉线程》Java通过interrupt()通知线程停止而非强制,确保线程自主处理中断,避免数据损坏,线程池的shutdown()等待任务完成,shutdownNow()强制中断... 目录为什么不强制停止为什么 Java 不提供强制停止线程的能力呢?如何用interrupt停止线程s

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess