电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

C#多线程编程实例实战

7页
  • 卖家[上传人]:公****
  • 文档编号:472329179
  • 上传时间:2023-12-25
  • 文档格式:DOC
  • 文档大小:35KB
  • / 7 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、C#多线程编程实例实战 C#多线程编程实例实战2008-12-15问题的提出所谓单个写入程序/多个阅读程序的线程同步问题,是指任意数量的线程访问共享资源时,写入程序(线程)需要修改共享资源,而阅读程序(线程)需要读取数据。在这个同步问题中,很容易得到下面二个要求: 1) 当一个线程正在写入数据时,其他线程不能写,也不能读。 2) 当一个线程正在读入数据时,其他线程不能写,但能够读。在数据库应用程序环境中经常遇到这样的问题。比如说,有n个最终用户,他们都要同时访问同一个数据库。其中有m个用户要将数据存入数据库,n-m个用户要读取数据库中的记录。 很显然,在这个环境中,我们不能让两个或两个以上的用户同时更新同一条记录,如果两个或两个以上的用户都试图同时修改同一记录,那么该记录中的信息就会被破坏。 我们也不让一个用户更新数据库记录的同时,让另一用户读取记录的内容。因为读取的记录很有可能同时包含了更新和没有更新的信息,也就是说这条记录是无效的记录。实现分析 规定任一线程要对资源进行写或读操作前必须申请锁。根据操作的不同,分为阅读锁和写入锁,操作完成之后应释放相应的锁。将单个写入程序/多个阅读程

      2、序的要求改变一下,可以得到如下的形式: 一个线程申请阅读锁的成功条件是:当前没有活动的写入线程。 一个线程申请写入锁的成功条件是:当前没有任何活动(对锁而言)的线程。因此,为了标志是否有活动的线程,以及是写入还是阅读线程,引入一个变量m_nActive,如果m_nActive 0,则表示当前活动阅读线程的数目,如果m_nActive=0,则表示没有任何活动线程,m_nActive 0,表示当前有写入线程在活动,注意m_nActive0,时只能取-1的值,因为只允许有一个写入线程活动。 为了判断当前活动线程拥有的锁的类型,我们采用了线程局部存储技术(请参阅其它参考书籍),将线程与特殊标志位关联起来。 申请阅读锁的函数原型为:public void AcquireReaderLock( int millisecondsTimeout ),其中的参数为线程等待调度的时间。函数定义如下: public void AcquireReaderLock( int millisecondsTimeout ) / m_mutext很快可以得到,以便进入临界区 m_mutex.WaitOne( ); /

      3、是否有写入线程存在 bool bExistingWriter = ( m_nActive 0 ); if( bExistingWriter ) /等待阅读线程数目加1,当有锁释放时,根据此数目来调度线程 m_nWaitingReaders+; else /当前活动线程加1 m_nActive+; m_mutex.ReleaseMutex(); /存储锁标志为Reader System.LocalDataStoreSlot slot = Thread.GetNamedDataSlot(m_strThreadSlotName); object obj = Thread.GetData( slot ); LockFlags flag = LockFlags.None; if( obj != null ) flag = (LockFlags)obj ; if( flag = LockFlags.None ) Thread.SetData( slot, LockFlags.Reader ); else Thread.SetData( slot, (LockFlags)(int)flag | (i

      4、nt)LockFlags.Reader ) ); if( bExistingWriter ) /等待指定的时间 this.m_aeReaders.WaitOne( millisecondsTimeout, true ); 它首先进入临界区(用以在多线程环境下保证活动线程数目的操作的正确性)判断当前活动线程的数目,如果有写线程(m_nActive=0),则可以让读线程继续运行。 申请写入锁的函数原型为:public void AcquireWriterLock( int millisecondsTimeout ),其中的参数为等待调度的时间。函数定义如下: public void AcquireWriterLock( int millisecondsTimeout ) / m_mutext很快可以得到,以便进入临界区 m_mutex.WaitOne( ); / 是否有活动线程存在 bool bNoActive = m_nActive = 0; if( !bNoActive ) m_nWaitingWriters+; else m_nActive-; m_mutex.ReleaseMute

      5、x(); /存储线程锁标志 System.LocalDataStoreSlot slot = Thread.GetNamedDataSlot( myReaderWriterLockDataSlot ); object obj = Thread.GetData( slot ); LockFlags flag = LockFlags.None; if( obj != null ) flag = (LockFlags)Thread.GetData( slot ); if( flag = LockFlags.None ) Thread.SetData( slot, LockFlags.Writer ); else Thread.SetData( slot, (LockFlags)(int)flag | (int)LockFlags.Writer ) ); /如果有活动线程,等待指定的时间 if( !bNoActive ) this.m_aeWriters.WaitOne( millisecondsTimeout, true ); 它首先进入临界区判断当前活动线程的数目,如果当前有活动线程存在,

      6、不管是写线程还是读线程(m_nActive),线程将等待指定的时间并且等待的写入线程数目加1,否则线程拥有写的权限。 释放阅读锁的函数原型为:public void ReleaseReaderLock()。函数定义如下: public void ReleaseReaderLock() System.LocalDataStoreSlot slot = Thread.GetNamedDataSlot(m_strThreadSlotName ); LockFlags flag = (LockFlags)Thread.GetData( slot ); if( flag = LockFlags.None ) return; bool bReader = true; switch( flag ) case LockFlags.None: break; case LockFlags.Writer: bReader = false; break; if( !bReader ) return; Thread.SetData( slot, LockFlags.None ); m_mutex.WaitOne

      7、(); AutoResetEvent autoresetevent = null; this.m_nActive -; if( this.m_nActive = 0 ) if( this.m_nWaitingReaders 0 ) m_nActive + ; m_nWaitingReaders -; autoresetevent = this.m_aeReaders; else if( this.m_nWaitingWriters 0) m_nWaitingWriters-; m_nActive -; autoresetevent = this.m_aeWriters ; m_mutex.ReleaseMutex(); if( autoresetevent != null ) autoresetevent.Set(); 释放阅读锁时,首先判断当前线程是否拥有阅读锁(通过线程局部存储的标志),然后判断是否有等待的阅读线程,如果有,先将当前活动线程加1,等待阅读线程数目减1,然后置事件为有信号。如果没有等待的阅读线程,判断是否有等待的写入线程,如果有则活动线程数目减1,等待的写入线程数目减

      8、1。释放写入锁与释放阅读锁的过程基本一致,可以参看源代码。 注意在程序中,释放锁时,只会唤醒一个阅读程序,这是因为使用AutoResetEvent的原历,读者可自行将其改成ManualResetEvent,同时唤醒多个阅读程序,此时应令m_nActive等于整个等待的阅读线程数目。 测试 测试程序取自.Net FrameSDK中的一个例子,只是稍做修改。测试程序如下, using System; using System.Threading; using MyThreading; class Resource myReaderWriterLock rwl = new myReaderWriterLock(); public void Read(Int32 threadNum) rwl.AcquireReaderLock(Timeout.Infinite); try Console.WriteLine(Start Resource reading (Thread=0), threadNum); Thread.Sleep(250); Console.WriteLine(Stop Resource reading (Thread=0), threadNum); finally rwl.ReleaseReaderLock(); public void Write(Int32 threadNum) rwl.AcquireWriterLock(Timeout.Infinite); try Console.WriteLine(Start Resource writing (Thread=0), threadNum); Thread.Sleep(750); Console.WriteLine(Stop Resource writing (Thread=0), threadNum); finally rwl.ReleaseWriterLock();

      《C#多线程编程实例实战》由会员公****分享,可在线阅读,更多相关《C#多线程编程实例实战》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.