C#中的多线程与线程互斥
通过多线程,C#可以并行地执行代码。
每一个线程都有它独立的执行路径,所有线程都能访问共有变量。
这就引发了线程竞争
这时就需要使用线程安全的处理方式使得线程互斥
先来看一段多线程代码
using System;
using System.Timers;
using System.Threading;
public class MultiThread{
static string str = " ";
public static void Main(string[] args) {
Thread t1 = new Thread(Add1);
t1.Start();
Thread t2 = new Thread(Add2);
t2.Start();
Thread.Sleep(1000);
Console.WriteLine(str);
}
public static void Add1() {
for (int i = 0; i < 10; i++) {
Thread.Sleep(10);
str += "1";
}
}
public static void Add2()
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(10);
str += "2";
}
}
}
线程Add1和线程Add2并行执行
因而变量str被两个线程同时操作
为了避免此线程竞争
可以通过加锁(lock)的方法解决
当两个线程争夺一个锁的时候,一个线程获得锁资源,另一个线程则等待
在不确定的多线程环境中代码以此方式处理被叫做线程安全
加锁后代码:
public static void Add1()
{
lock (str)
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(10);
str += "1";
}
}
}
public static void Add2()
{
lock (str)
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep(10);
str += "2";
}
}
}
明天总结Unity服务端连接MySql数据库,嗯~
C#中的多线程与线程互斥的更多相关文章
- Python之多线程:线程互斥与线程同步
一.锁在多线程中的使用:线程互斥 lock = threading.Lock()#创建一个锁对象 1.with lock: pass 和进程使用的方式相同 2.控制线程结束的时间 通过一个全局变量 ...
- Qt中的多线程与线程池浅析+实例
1. Qt中的多线程与线程池 今天学习了Qt中的多线程和线程池,特写这篇博客来记录一下 2. 多线程 2.1 线程类 QThread Qt 中提供了一个线程类,通过这个类就可以创建子线程了,Qt 中一 ...
- 细说.NET中的多线程 (二 线程池)
上一章我们了解到,由于线程的创建,销毁都是需要耗费大量资源和时间的,开发者应该非常节约的使用线程资源.最好的办法是使用线程池,线程池能够避免当前进行中大量的线程导致操作系统不停的进行线程切换,当线程数 ...
- Linux C多线程编程-线程互斥
Linux下的多线程编程需要注意的是程序需要包含头文件pthread.h,在生成可执行文件的时候需要链接库libpthread.a或者libpthread.so. 线程创建函数: pthread_cr ...
- 并发编程~~~多线程~~~守护线程, 互斥锁, 死锁现象与递归锁, 信号量 (Semaphore), GIL全局解释器锁
一 守护线程 from threading import Thread import time def foo(): print(123) time.sleep(1) print('end123') ...
- 细说.NET 中的多线程 (一 概念)
为什么使用多线程 使用户界面能够随时相应用户输入 当某个应用程序在进行大量运算时候,为了保证应用程序能够随时相应客户的输入,这个时候我们往往需要让大量运算和相应用户输入这两个行为在不同的线程中进行. ...
- NET 中的多线程
NET 中的多线程 为什么使用多线程 使用户界面能够随时相应用户输入 当某个应用程序在进行大量运算时候,为了保证应用程序能够随时相应客户的输入,这个时候我们往往需要让大量运算和相应用户输入这两个行为在 ...
- Python多线程、线程池及实际运用
我们在写python爬虫的过程中,对于大量数据的抓取总是希望能获得更高的速度和效率,但由于网络请求的延迟.IO的限制,单线程的运行总是不能让人满意.因此有了多线程.异步协程等技术. 下面介绍一下pyt ...
- Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)
线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...
随机推荐
- java复习笔记
本笔记(无异常处理与网络编程部分)整理自<java程序设计>-黄岚 王岩 王康平 编著 java数据 UI I/O java线程 数据库操作 Java数 ...
- 《android开发艺术探索》读书笔记(二)--IPC机制
接上篇<android开发艺术探索>读书笔记(一) No1: 在android中使用多进程只有一种方法,那就是给四大组件在AndroidMenifest中指定android:process ...
- 多项式A除以B
这个问题我是在PAT大区赛题里遇见的.题目如下: 多项式A除以B(25 分) 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数 ...
- java日期转化
package com.kang.util; import java.text.ParseException; import java.text.SimpleDateFormat; import ja ...
- web前端开发工程师工资多少
做web前端开发工程师工资高不高?下面千锋小编为大家分析一下:作为目前互联网行业中的主流技术,Web前端一直是占有重要的地位.尤其是近年来HTML5技术的突飞猛进,使Web前端技术有了更好的发展. ...
- 自动提取文章摘要AutoSummary
在文本搜索引擎项目中,需要对已排序的文章进行摘要提取,然后与标题,路径一起封装成Json数据返回客户端.因此这里我自己写一个自动摘要,来大概完成这个任务.在自动摘要提取过程中,使用了一个分词库:Cpp ...
- python语言中的AOP利器:装饰器
一.前言 面向切面编程(AOP)是一种编程思想,与OOP并不矛盾,只是它们的关注点相同.面向对象的目的在于抽象和管理,而面向切面的目的在于解耦和复用. 举两个大家都接触过的AOP的例子: 1)java ...
- ORACLE NLS_DATE_FORMAT设置
最近在ORACLE里面设置NLS_DATE_FORMAT日期时间格式时遇到了一些问题,顺便整理一下.以防以后忘记时,能顺速翻阅. 1:在会话级别设置nls_date_format对应的日期格式. ...
- 3.2 PCI设备的数据传递
PCI设备的数据传递使用地址译码方式,当一个存储器读写总线事务到达PCI总线时,在这条总线上的所有PCI设备将进行地址译码,如果当前总线事务使用的地址在某个PCI设备的BAR空间中时,该PCI设备将使 ...
- HighCharts之2D柱状图、折线图和饼图的组合图
HighCharts之2D柱状图.折线图和饼图的组合图 1.实例源码 ColumnLinePie.html: <!DOCTYPE html> <html> <head&g ...