首页 > 编程语言 >c#读写锁浅记录

c#读写锁浅记录

时间:2023-05-26 11:35:11浏览次数:42  
标签:Console Thread 记录 c# 读写 DateTime WriteLine GetHashCode fff

public class C
  {
    static private ReaderWriterLockSlim rwl = new ReaderWriterLockSlim();
    public static void Main()
    {
      Thread t_read1 = new Thread(new ThreadStart(WriteSomething));
      t_read1.Start();
      Console.WriteLine("{0} Create Thread ID {1} , Start WriteSomething", DateTime.Now.ToString("hh:mm:ss fff"), t_read1.GetHashCode());
      Thread t_read2 = new Thread(new ThreadStart(WriteSomething));
      t_read2.Start();
      Console.WriteLine("{0} Create Thread ID {1} , Start WriteSomething ", DateTime.Now.ToString("hh:mm:ss fff"), t_read2.GetHashCode());
      Thread t_write1 = new Thread(new ThreadStart(ReadSomething));
      t_write1.Start();
      Console.WriteLine("{0} Create Thread ID {1} , Start ReadSomething", DateTime.Now.ToString("hh:mm:ss fff"), t_write1.GetHashCode());
      Thread t_write2 = new Thread(new ThreadStart(ReadSomething));
      t_write2.Start();
      Console.WriteLine("{0} Create Thread ID {1} , Start ReadSomething", DateTime.Now.ToString("hh:mm:ss fff"), t_write2.GetHashCode());

    }
    static public void ReadSomething()
    {
      Console.WriteLine("{0} Thread ID {1} Begin EnterReadLock...", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
      rwl.EnterReadLock();
      try
      {
        Console.WriteLine("{0} Thread ID {1} reading sth...", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
        Thread.Sleep(5000);//模拟读取信息
        Console.WriteLine("{0} Thread ID {1} reading end.", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
      }
      finally
      {
        rwl.ExitReadLock();
        Console.WriteLine("{0} Thread ID {1} ExitReadLock...", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
      }
    }
    static public void WriteSomething()
    {
      Console.WriteLine("{0} Thread ID {1} Begin EnterWriteLock...", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
      rwl.EnterWriteLock();
      try
      {
        Console.WriteLine("{0} Thread ID {1} writing sth...", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
        Thread.Sleep(10000);//模拟写入信息
        Console.WriteLine("{0} Thread ID {1} writing end.", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
      }
      finally
      {
        rwl.ExitWriteLock();
        Console.WriteLine("{0} Thread ID {1} ExitWriteLock...", DateTime.Now.ToString("hh:mm:ss fff"), Thread.CurrentThread.GetHashCode());
      }
    }
  }

可以同时读取数据,但只能一个线程进入写数据。

标签:Console,Thread,记录,c#,读写,DateTime,WriteLine,GetHashCode,fff
From: https://www.cnblogs.com/Insist-Y/p/17434291.html

相关文章

  • 深度学习进阶篇-预训练模型[3]:XLNet、BERT、GPT,ELMO的区别优缺点,模型框架、一些Trick
    深度学习进阶篇-预训练模型[3]:XLNet、BERT、GPT,ELMO的区别优缺点,模型框架、一些Trick、TransformerEncoder等原理详细讲解1.XLNet:GeneralizedAutoregressivePretrainingforLanguageUnderstanding1.1.从AR和AE模型到XLNet模型自回归模型(AutoregressiveModel,AR),通过估计......
  • RUBY-FLEX实践—利用swfobject在RUBY工程中加载SWF
    开发环境:Ruby:Ruby1.9.1Rails:Rails2.3.5IDE:RubyMine2.0.1FlexBuilder:FlexBuilder4 开发思路:1)在FlexBuilder中创建Flex工程2)在RubyMine中创建Rails工程3)将Flex工程bin-debug下编译的swfobject.js拷贝至Ruby工程指定位置4)引用Flex工程编译后的html中的内容实现在Rails页面中嵌......
  • FLEX4实践—DropDownList与ComboBox
    FLEX4相对FLEX3的组件变化列表中列出以这么一项:mx.controls.ComboBox->spark.components.DropDownList 官方解释如下:   ComboBox控件是DropDownListBase控件的子类。与DropDownListBase控件类似,当用户从ComboBox控件的下拉列表中选择某项时,数据项将显示在......
  • C++中extern "C"的使用
    由上一篇博客知识可得,C++中对符号表中符号的生成方式是不一样的,所以我们需要一种兼容方式处理他们上篇博客地址:https://www.cnblogs.com/woodx/p/17434227.html 但是如果我们需要沿用C的代码,需要链接静态库或动态库的时候,是不是会发生冲突呢 因此需要提前声明extern"C" ......
  • 四、JUC-LockSupport与线程中断
    一、线程中断机制1、概述一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop、Thread.suspend、Thread.resume都已经被废弃了在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供了一种用于......
  • 关于MySQL的JDBC Driver加载过程详解
    在使用JDBC时,都需要提前加载对应数据库的Driver类,MySQL为例:Class.forName("com.mysql.jdbc.Driver")但是不写这句代码也可以让 com.mysql.jdbc.Driver类成功加载,这就涉及到java.sql.DriverManager类了,先看一下代码:publicclassDriverManager{//注册驱动的集合priva......
  • 定时crontab执行数据库备份不起作用,手动运行起作用的问题
    用crontab定时任务去执行mysqldump,定时备份数据库,手动是可以执行的。如下图,生成了备份文件。但是,用crontab去执行这个back.sh脚本的话,是不会生成备份文件的,起初怀疑crontab没有执行。查看crontab日志 cat  /var/log/cron发现,是执行了的注意,crontab执行出错的信息,不会......
  • Permutation Invariant Graph Generation via Score-Based Generative Modeling
    目录概符号说明本文方法代码NiuC.,SongY.,SongJ.,ZhaoS.,GroverA.andErmonS.Permutationinvariantgraphgenerationviascore-basedgenerativemodeling.AISTATS,2020.概本文利用diffusion进行图的生成,很朴素.符号说明\(\mathbf{A}^{\pi}\),邻接......
  • UNIX网络编程:socket & select() 实现clients/server通信
    一、问题引入UNIX网络编程卷1:套接字联网API(第三版)第6章介绍了I/O复用可以通过select()的单进程服务器与多客户端通信。UNIX下可用的5中I/O模型:阻塞式I/O非阻塞式I/OI/O(select和poll)信号驱动式I/O(SIGIO)异步I/O(POSIX的aio_系列函数)其中前面4种可以分为同步I/O,第五种为......
  • mac m1 安装docker redis最新版本
    终端输入命令,等待下载成功dockerpullimagesredis:latest查看本地是否下载成功启动redis容器dockerrun-itd--nameredis-dev-p6379:6379redis--name:随便起个名字,比如redis-dev-p6379:6379:映射容器服务的6379端口到宿主机的6379端口。外部可以直接通过宿主......