C#使用读写锁解决多线程并发写入文件时线程同步的问题
2018-08-03 11:57
633 查看
读写锁是以 ReaderWriterLockSlim 对象作为锁管理资源的,不同的 ReaderWriterLockSlim 对象中锁定同一个文件也会被视为不同的锁进行管理,这种差异可能会再次导致文件的并发写入问题,所以 ReaderWriterLockSlim 应尽量定义为只读的静态对象。
多线程同时写入文件
class Program { static int writeCount = 0; static int wrongCount = 0; static void Main(string[] args) { Test(); } static void Test() { //迭代运行写入内容,由于多个线程同时写入同一个文件将会导致错误 Parallel.For(0, 100, 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(4), 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 = 0; static int wrongCount = 0; static void Main(string[] args) { Test(); } static ReaderWriterLockSlim writeLock = new ReaderWriterLockSlim(); static void Test() { //迭代运行写入内容 Parallel.For(0, 100, 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(4), 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#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题
- C#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题
- C#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题
- C#使用读写锁三行代码简单解决多线程并发的问题
- 用读写锁三句代码解决多线程并发写入文件 z
- C#解决SQlite并发异常问题的方法(使用读写锁)
- 使用ThreadLocal解决多线程的并发问题
- php中,高并发状态下文件的读写 (解决多线程同时读写一个文件的问题)
- 使用ThreadLocal解决多线程程序并发问题
- c#中使用多线程访问winform中控件的若干问题 解决线程间操作无效: 从不是创建控件的线程访问它
- C# 解决datatable写入文件内存溢出问题
- (转) C#中Timer使用及解决重入(多线程同时调用callback函数)问题
- C#中使用多线程访问Winform问题解决方案
- 使用Spring4.3解决缓存过期后多线程并发访问数据库的问题
- 使用ThreadLocal解决多线程的并发问题
- PHP文件写入函数file_put_contents并发追加写入丢失内容问题解决方法
- (C#)使用队列(Queue)解决简单的并发问题
- C#中使用多线程访问Winform问题解决方案
- C#中使用多线程访问Winform问题解决方案
- 使用ThreadLocal解决多线程的并发问题