知识大全 C#多线程学习—生产者和消费者(1)

Posted

篇首语:习惯使我们双手机巧,使头脑笨拙。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#多线程学习—生产者和消费者(1)相关的知识,希望对你有一定的参考价值。

C#多线程学习—生产者和消费者(1)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    前面说过 每个线程都有自己的资源 但是代码区是共享的 即每个线程都可以执行相同的函数 这可能带来的问题就是几个线程同时执行一个函数 导致数据的混乱 产生不可预料的结果 因此我们必须避免这种情况的发生

    C#提供了一个关键字lock 它可以把一段代码定义为互斥段(critical section) 互斥段在一个时刻内只允许一个线程进入执行 而其他线程必须等待 在C#中 关键字lock定义如下

    lock(expression) statement_block

    expression代表你希望跟踪的对象 通常是对象引用

    如果你想保护一个类的实例 一般地 你可以使用this 如果你想保护一个静态变量(如互斥代码段在一个静态方法内部) 一般使用类名就可以了

    而statement_block就是互斥段的代码 这段代码在一个时刻内只可能被一个线程执行

    下面是一个使用lock关键字的典型例子 在注释里说明了lock关键字的用法和用途

    示例如下

 using System;using System Threading;

namespace ThreadSimple    internal class Account             int balance;        Random r = new Random();                internal Account(int initial)                     balance = initial;       

        internal int Withdraw(int amount)                     if (balance < )                            //如果balance小于 则抛出异常                throw new Exception( Negative Balance );                        //下面的代码保证在当前线程修改balance的值完成之前            //不会有其他线程也执行这段代码来修改balance的值            //因此 balance的值是不可能小于 的            lock (this)                            Console WriteLine( Current Thread: +Thread CurrentThread Name);                //如果没有lock关键字的保护 那么可能在执行完if的条件判断之后                //另外一个线程却执行了balance=balance amount修改了balance的值                //而这个修改对这个线程是不可见的 所以可能导致这时if的条件已经不成立了                //但是 这个线程却继续执行balance=balance amount 所以导致balance可能小于                 if (balance >= amount)                                     Thread Sleep( );                    balance = balance amount;                    return amount;                                else                                     return ; // transaction rejected                                              internal void DoTransactions()                     for (int i = ; i < ; i++)             Withdraw(r Next( ));           

    internal class Test             static internal Thread[] threads = new Thread[ ];        public static void Main()                     Account acc = new Account ( );            for (int i = ; i < ; i++)                             Thread t = new Thread(new ThreadStart(acc DoTransactions));                threads[i] = t;                        for (int i = ; i < ; i++)                 threads[i] Name=i ToString();            for (int i = ; i < ; i++)                 threads[i] Start();            Console ReadLine();           

cha138/Article/program/net/201311/15368

相关参考

知识大全 C#多线程学习—生产者和消费者(3)

C#多线程学习—生产者和消费者(3)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 Java多线程--生产者与消费者

Java多线程--生产者与消费者  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  模拟生产者与消费

知识大全 由生产者/消费者问题看JAVA多线程

由生产者/消费者问题看JAVA多线程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  生产者消费者

知识大全 java多线程之消费者生产者模式

  /*@authorshijin*生产者与消费者模型中要保证以下几点*同一时间内只能有一个生产者生产    生产方法加锁sychronized*同一时间内只能

知识大全 Java多线程例子

Java多线程例子  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  写出一组模拟生产者/消费者的协

知识大全 C#创建多线程应用程序

C#创建多线程应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在NET和C#中编写一个多

知识大全 C#多线程编程实例

C#多线程编程实例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  问题的提出  所谓单个写入程序

知识大全 详细讲解C#的多线程能力

详细讲解C#的多线程能力  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  线程是允许进行并行计算的

知识大全 C#多线程中lock的用法

C#多线程中lock的用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  经常碰到同时需要对某个

知识大全 C#中构建多线程应用程序

C#中构建多线程应用程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  引言  随着双核四核等多