读写锁是以 ReaderWriterLockSlim 对象作为锁管理资源的,不同的 ReaderWriterLockSlim 对象中锁定同一个文件也会被视为不同的锁进行管理,这种差异可能会再次导致文件的并发写入问题,所以 ReaderWriterLockSlim 应尽量定义为只读的静态对象。

多线程同时写入文件

class Program
{
static int writeCount = ;
static int wrongCount = ;
static void Main(string[] args)
{
Test();
}
static void Test()
{
//迭代运行写入内容,由于多个线程同时写入同一个文件将会导致错误
Parallel.For(, , e =>
{
try
{
writeCount++;
var logFilePath = "/test.txt";
var now = DateTime.Now;
var logContent = string.Format("Tid: {0}{1} {2}=>{3}\r\n", Thread.CurrentThread.ManagedThreadId.ToString().PadRight(), now.ToLongDateString(), now.ToLongTimeString(), writeCount); File.AppendAllText(logFilePath, logContent);
}
catch (Exception ex)
{
wrongCount++;
Console.WriteLine("累计失败" + wrongCount + "次");
Console.WriteLine(ex.Message);
throw;
}
}); Console.Read();
}
}

运行结果

只有部分数据写入了文件

多线程使用读写锁同步写入文件

class Program
{
static int writeCount = ;
static int wrongCount = ;
static void Main(string[] args)
{
Test();
}
static ReaderWriterLockSlim writeLock = new ReaderWriterLockSlim();
static void Test()
{
//迭代运行写入内容
Parallel.For(, , e =>
{
try
{
writeLock.EnterWriteLock();
writeCount++;
var logFilePath = "/test.txt";
var now = DateTime.Now;
var logContent = string.Format("Tid: {0}{1} {2}=>{3}\r\n", Thread.CurrentThread.ManagedThreadId.ToString().PadRight(), now.ToLongDateString(), now.ToLongTimeString(), writeCount); File.AppendAllText(logFilePath, logContent);
}
catch (Exception ex)
{
wrongCount++;
Console.WriteLine("累计失败" + wrongCount + "次");
Console.WriteLine(ex.Message);
throw;
}
finally
{
writeLock.ExitWriteLock();
}
}); Console.Read();
}
}

运行成功,数据全部写入文件

C#使用读写锁解决多线程并发写入文件时线程同步的问题的更多相关文章

  1. C#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题

    (补充:初始化FileStream时使用包含文件共享属性(System.IO.FileShare)的构造函数比使用自定义线程锁更为安全和高效,更多内容可点击参阅) 在开发程序的过程中,难免少不了写入错 ...

  2. 用读写锁三句代码解决多线程并发写入文件 z

    C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题 在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三 ...

  3. C# 防止同时调用=========使用读写锁三行代码简单解决多线程并发的问题

    http://www.jb51.net/article/99718.htm     本文主要介绍了C#使用读写锁三行代码简单解决多线程并发写入文件时提示"文件正在由另一进程使用,因此该进程无 ...

  4. Linux多线程实践(6) --Posix读写锁解决读者写者问题

    Posix读写锁 int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *rest ...

  5. .Net 并发写入文件的多种方式

    1.简介 本文主要演示日常开发中利用多线程写入文件存在的问题,以及解决方案,本文使用最常用的日志案例! 2.使用File.AppendAllText写入日志 这是种常规的做法,通过File定位到日志文 ...

  6. sublime python3中读取和写入文件时如何解决编码问题

    # -*- coding: utf-8 -*- #分析用户身份审核信息 #python 3.5 #xiaodeng #http://apistore.baidu.com/apiworks/servic ...

  7. python自带编译器在写入文件时闪退,或者一步步执行到写入时提示8170。解决办法:

    用python黑框运行程序写入文件时闪退,或一行行运行到写入时提示8170数字. 经试验,为文件路径错误导致. with open("1.doc", "wb") ...

  8. 秒杀多线程第八篇 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <且不超过最大资源数量. 第三个參数能够用来传出先前的资源计数,设为NULL表示不须要传出. 注意:当 ...

  9. 转---秒杀多线程第八篇 经典线程同步 信号量Semaphore

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...

随机推荐

  1. 【译】参考手册-React组件

    react version: 15.4.2 React.Component 组件能够让你将UI拆分为多个独立自治并可重用的部分.在 React 中提供了 React.Component. 概述 Rea ...

  2. 一款优秀的前端框架——AngularJS

      前  言 AngularJS是一款为了克服HTML在构建应用上的不足而设计的优秀的前端JS框架.AngularJS有着诸多特性,最为核心的是:MVC.模块化.自动化双向数据绑定.语义化标签.依赖注 ...

  3. Php7 开发笔记

    Ubuntu环境安装 http://www.jianshu.com/p/1d312d9f1be1 sudo apt-get install python-software-properties sof ...

  4. 二次剩余从csdn

    欧拉准则 模\(p\)意义下,\(a\)是二次剩余等价于\(a^{\frac{p-1}{2}}\equiv 1\),\(a\)不是二次剩余等价于\(a^{\frac{p-1}{2}}\equiv -1 ...

  5. Array Queries CodeForces - 797E

    题目链接 非常好的一道题目, 分析,如果用暴力的话,时间复杂度是O(q*n)稳稳的超时 如果用二维DP的话,需要O (n*n)的空间复杂度,会爆空间. 那么分析一下,如果k>sqrt(n)的话, ...

  6. hibernate 的sum(filed)引发的NullPointException错误解决过程

    背景: 在用hql语句进行sum查询时遭遇NPE问题: StringBuilder builder = new StringBuilder("select SUM(actualWorking ...

  7. shell脚本--编写CGI代码(shell结合html)以及环境变量

    实现shell和html标签混合的方式编写代码: 推荐  初始CGI ,看完大概之后,大概对cgi有个大体的印象.下面是编写混合代码的示例: #!/bin/bash #index.cgi echo & ...

  8. 【Python3练习题 016】 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

    这题得倒着推.第10天还没吃,就剩1个,说明第9天吃完一半再吃1个还剩1个,假设第9天还没吃之前有桃子p个,可得:p * 1/2 - 1 = 1,可得 p = 4.以此类推,即可手算出. 代码思路为: ...

  9. Bootstrap知识记录:表单和图片

    一.表单Bootstrap 提供了一些丰富的表单样式供开发者使用.1.基本格式//实现基本的表单样式<form><div class="form-group"&g ...

  10. composer 自动加载一 通过file加载

    github地址 https://github.com/brady-wang/composer composer init 可以生成一个composer.json文件 { "name&quo ...