知识大全 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) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
Java多线程--生产者与消费者 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 模拟生产者与消费
由生产者/消费者问题看JAVA多线程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 生产者消费者
/*@authorshijin*生产者与消费者模型中要保证以下几点*同一时间内只能有一个生产者生产 生产方法加锁sychronized*同一时间内只能
Java多线程例子 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 写出一组模拟生产者/消费者的协
C#创建多线程应用程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在NET和C#中编写一个多
C#多线程编程实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 问题的提出 所谓单个写入程序
详细讲解C#的多线程能力 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 线程是允许进行并行计算的
C#多线程中lock的用法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 经常碰到同时需要对某个
C#中构建多线程应用程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 引言 随着双核四核等多