C#编程总结(五)关于多线的思考

1、什么时候使用多线程?

这个问题,对于系统架构师、设计者、程序员,都是首先要面对的一个问题。

在什么时候使用多线程技术?

在许多常见的情况下,可以使用多线程处理来显著提高应用程序的响应能力和可用性。

上一章,我们讲了几个多线程的应用案例,主要的应用场景也做了介绍。这里不再赘述。

http://www.cnblogs.com/yank/p/3232955.html

2、如何才能保证线程安全?

使用多线程,这是一个必须要弄清的问题。只有了解了多线程对结构和程序的影响,才能真正会使用 多线程,使其发挥应有的效果。

为什么应用多线程就不安全了呢?

线程安全的一个判定指标,线程之间有没有临界资源,如果有临界资源,且没有采用合理的同步机制 ,就会出现多个线程竞争一个资源,如若多个线程都在为得不到所需的资源,则会发生死锁。死锁,线 程就会彼此僵持,系统停滞不前,如果后果严重,则直接导致系统崩溃。常见的案例有:生产者与消费 者问题、哲学家就餐问题等。

咱就根据哲学家就餐问题做个简化:两个人去餐馆吃饭,由于资源紧张,只有一双筷子,每个人都饿 了,都想吃饭,且同时去抢筷子,势均力敌,两人每人抢到一根筷子,只有使用一双筷子才能吃饭。这 时你会说了,我可以用手抓着吃,呵呵。如果是刚出锅的饺子,怕你抓不起来。两个人只能面面相觑, 大眼瞪小眼,就是吃不上。如果如果僵持个一年半载,都饿死了。哈哈。如果我们给一个约定,在拿筷 子时,一下拿到一双,且吃完就交换给对方。则两个人都高高兴兴吃上饭了。筷子就是临界资源。当然 ,在两个人僵持的时候,可以进行外部干预,使得两个人都有饭吃。比如:强制一方将筷子空闲出来, 则另一方就饭吃了。吃完了筷子空闲出来,则另一个人也有饭吃了。

只要我们处理好临界资源问题,也就解决了线程安全问题。

使用多线程,未必必须要做好线程同步,但是如果有临界资源,则必须进行线程同步处理。

3、 如何能写出线程安全的代码?

在OOP中,程序员使用的无非是:变量、对象(属性、方法)、类型等等。

1)变量

变量包括值类型和引用类型。

值类型是线程安全的,但是如果作为对象的属性,值类型就被附加到对象上,需要参考对象的线程安 全性。

引用类型,这里要注意的是,对于引用对象,他包括了引用和对象实例两部分,实例需要通过对其存 储位置的引用来访问,对于

private Object o = new Object(),

其实可以分解为两句话:

private Object o;

o = new Object();

其中private Object o是定义了对象的引用,也就是记录对象实例的指针,而不是对象本身。这个引 用存储于堆栈中,占用4个字节;当没有使用o = new Object()时,引用本身的值为null,也就是不指向 任何有效位置;当o = new Object()后,才真正根据对象的大小,在托管堆中分配空间给对象实例,然 后将实例的指针位置赋值给前面的引用。这才完成一个对象的实例化。

引用类型的安全性,在于:可以由多个引用,同时指向一个内存地址。如果一个引用被修改,另一个 也会修改。

using System;

namespace VariableSample
{
    class Program
    {
        static void Main(string[] args)
        {
            Box b1 = new Box();
            b1.Name = "BigBox";

            Console.WriteLine("Create Box b1.");
            Console.WriteLine("Box: b1'Name is {0}.", b1.Name);
            Console.WriteLine("Create same Box b2.");

            Box b2 = b1;
            b2.Name = "LittleBox";

            Console.WriteLine("Box: b2's Name is {0}.",b2.Name);
            Console.WriteLine("Box: b1's Name is {0}.", b1.Name);

            Console.ReadKey();
        }
    }

    /// <summary>
    /// 盒子
    /// </summary>
    public class Box
    {
        /// <summary>
        /// 名称
        /// </summary>
        public string Name
        {
            get;
            set;
        }
    }

}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索问题
, 对象
, 线程
, 多线程
, 类型
, 一个
, c#案例
哲学家就餐问题
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-09-17 04:02:41

C#编程总结(五)关于多线的思考的相关文章

opengl编程宝典第五版-关于opengl编程第五版的问题

问题描述 关于opengl编程第五版的问题 错误 1 error LNK1104: 无法打开文件"freeglut_static.lib" C:Userschen470547406DocumentsVisual Studio 2013OpenGL01_Tringle01_TringleLINK 001_Tringle 百度过了解决方法,都试过了,还是不行,求解决,纯新手,非伸手党 解决方案 你去下载opengl库放好,一般不会出现这个,我有过这个是因为我的位置放不好

CUDA编程(五)关注内存的存取模式

CUDA编程(五) 关注内存的存取模式 上一篇博客我们使用Thread完成了简单的并行加速,虽然我们的程序运行速度有了50甚至上百倍的提升,但是根据内存带宽来评估的话我们的程序还远远不够, 除了通过Block继续提高线程数量来优化性能,这次想给大家先介绍一个访存方面非常重要的优化,同样可以大幅提高程序的性能~ 什么样的存取模式是高效的? 大家知道一般显卡上的内存是 DRAM,因此最有效率的存取方式,是以连续的方式存取,单纯说连续存取可能比较抽象,我们还是通过例子来看这个问题. 之前的程序,大家可

058_《突破Delphi7.0编程实例五十讲》

<突破Delphi7.0编程实例五十讲> Delphi 教程 系列书籍 (058) <突破Delphi7.0编程实例五十讲> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Pdf 作者: 张增强 丛书名: 万水编程实例五十讲丛书 出版社:中国水利水电出版社 ISBN:7508412761 上架时间:2002-12-21 出版日期:2002 年12月 开本:16开 页码:362 版次:1-1 内容简介 Delphi是面向对象的可视化编程语言,它是目前面向对

5天玩转C#并行和多线程编程 —— 第五天 多线程编程大总结

5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 -- 第一天 认识Parallel 5天玩转C#并行和多线程编程 -- 第二天 并行集合和PLinq 5天玩转C#并行和多线程编程 -- 第三天 认识和使用Task 5天玩转C#并行和多线程编程 -- 第四天 Task进阶 5天玩转C#并行和多线程编程 -- 第五天 多线程编程大总结    一.多线程带来的问题 1.死锁问题  前面我们学习了Task的使用方法,其中Task的等待机制让我们瞬间爱上了它,但是如果我们在调用Ta

网站订单少?学会五步,线上销售效果翻倍!

营销型网站对消费类企业十分重要.建设营销型网站,就是要明确网站的营销职能,以营销为核心目标来进行网站建设运营,目标是获得销售线索或直接获得订单. 事实证明,传统观念中的网站FLASH形象首页.大篇幅企业新闻报道.领导人风采展示.产品介绍不详等现象,均使得企业线上流量很难发挥出来.而营销型网站就像24小时在线的业务员,能抓住访客的注意力:洞察用户的需求:传达产品的优势:解除用户决策障碍,并顺利促使目标客户留下销售线索或者直接下订单. 那么,什么样的网站才是有效果的营销型网站呢? 一个健康的营销型网

Linux Shell脚本编程的五个经典例子【新手学习】

例子一:绘制特殊图形 #!/bin/bash   MAX_NO=0   echo -n "Enter Number between (5 to 9) : "  read MAX_NO   if ! [ $MAX_NO -ge 5 -a $MAX_NO -le 9 ] ; then  echo "WTF... I ask to enter number between 5 and 9, Try Again"  exit 1  fi   clear   for (( i

ASP 3.0高级编程(五)

编程|高级 1. 操作HTTP报头我们已经在几处见到ASP如何创建或修改在响应页面请示时被发送到客户的HTTP报头.在Response对象中有几个属性和方法可帮助我们做到一点.下面是一些报头方法:· 控制缓存和有效期.· 创建状态和定制的HTTP报头.· 指定MIME类型或内容类型.· 添加PICS标签.接下来将简要地研究每一个方面.可在"Response Object"主页(show_response.asp)上,单击相关属性名或方法名,来检查我们所说的属性和方法,如下图所示: 1.

Java Socket编程(五)

编程 简单的WEB服务器 一个简单的WEB服务器将由列表9.2这样构建.当然,还必须要对方法和回应事件进行改进.简单的服务器不会分析和存储请求头.新的WEB服务器将分析和存储请求,为以后的处理作准备.为了达到这个目的,你必须有一个包含HTTP请求的类. HTTPrequest类 列表9.5列出了一个完整的HTTPrequest类.这个类必须包括一个请求头所需的所有信息. 列表9.5.HTTPrequest类. import java.io.*; import java.util.*; impor

精通VC与Matlab联合编程(五)

在前面的介绍中,只是简介绍了VC与Matlab程序设计的几个简单例子,很多关键性的知识都没有介绍(例如函数的输入输出格式,VC中调用工具箱函数,编译器的使用,几种方法的混合使用等等)在以后的文章中,将会对这些知识进行介绍(因此标题也改了一下,呵呵,如果有错误的地方,还望大家多多指点)VC调用Matlab的方法有多种,为了对混合编程有一个大概认识,将常用的几种方法中介绍一下: 一.通过Matlab Engine方式 Matlab Engine是指一组Matlab提供的接口函数,支持C语言, Mat