当前位置: 首页 > news >正文

C# 中实现一个线程持续读取,另一个线程负责写入,且写入时读取线程暂停

实现思路

  1. 暂停信号通过 ManualResetEventSlim 通知读取线程暂停

  2. 暂停确认:读取线程收到暂停信号后,发送确认信号。

  3. 原子性控制:确保写入操作执行期间,读取线程处于完全暂停状态。

  4. 恢复机制写入完成后恢复读取线程。

代码实现

using System;
using System.Threading;

public class ReadWriteController
{
    // 控制读取线程暂停和恢复的信号
    private readonly ManualResetEventSlim _pauseRequest = new ManualResetEventSlim(false);
    // 读取线程确认已暂停的信号
    private readonly ManualResetEventSlim _pausedConfirmed = new ManualResetEventSlim(false);
    // 停止读取线程的标志
    private volatile bool _stopRequested = false;

    // 读取线程的循环任务
    public void ReadLoop()
    {
        while (!_stopRequested)
        {
            // 检查是否需要暂停
            if (_pauseRequest.IsSet)
            {
                // 确认已暂停,并等待恢复信号
                _pausedConfirmed.Set();
                _pauseRequest.Wait();
                _pausedConfirmed.Reset();
            }

            // 模拟读取操作(此处可替换为实际业务逻辑)
            Console.WriteLine($"[Read] {DateTime.Now:HH:mm:ss.fff} - Reading data...");
            Thread.Sleep(1000); // 模拟耗时操作
        }
        Console.WriteLine("[Read] Thread stopped.");
    }

    // 写入操作的外部触发方法
    public void WriteCommand()
    {
        // 发送暂停请求
        _pauseRequest.Set();
        Console.WriteLine("[Write] Pause request sent.");

        // 等待读取线程确认暂停
        _pausedConfirmed.Wait();
        Console.WriteLine("[Write] Read thread paused. Starting write operation...");

        // 模拟写入操作(此处可替换为实际业务逻辑)
        Thread.Sleep(500); // 模拟耗时操作
        Console.WriteLine($"[Write] {DateTime.Now:HH:mm:ss.fff} - Write completed.");

        // 恢复读取线程
        _pauseRequest.Reset();
        Console.WriteLine("[Write] Read thread resumed.");
    }

    // 停止所有线程
    public void Stop()
    {
        _stopRequested = true;
        _pauseRequest.Set(); // 确保读取线程退出等待
    }
}

// 使用示例
public class Program
{
    public static void Main()
    {
        var controller = new ReadWriteController();

        // 启动读取线程
        var readThread = new Thread(controller.ReadLoop);
        readThread.Start();

        // 模拟写入操作(每隔3秒触发一次)
        for (int i = 0; i < 3; i++)
        {
            Thread.Sleep(3000);
            controller.WriteCommand();
        }

        // 停止所有线程
        controller.Stop();
        readThread.Join();
        Console.WriteLine("Main thread exited.");
    }
}

代码解析

1. 控制信号定义
  • _pauseRequest:写入线程通过 Set() 发送暂停请求,读取线程通过 Wait() 阻塞自身。

  • _pausedConfirmed:读取线程暂停后通过 Set() 通知写入线程,确保写入操作安全执行。

2. 读取线程逻辑
while (!_stopRequested)
{
    if (_pauseRequest.IsSet)
    {
        _pausedConfirmed.Set();    // 确认已暂停
        _pauseRequest.Wait();      // 等待恢复信号
        _pausedConfirmed.Reset();  // 重置确认信号
    }
    // 执行读取操作...
}
  • 每次循环检查暂停请求。

  • 若收到暂停信号,立即确认并阻塞自身,直到写入完成。

3. 写入线程逻辑
public void WriteCommand()
{
    _pauseRequest.Set();          // 发送暂停请求
    _pausedConfirmed.Wait();      // 等待读取线程确认暂停
    // 执行写入操作...
    _pauseRequest.Reset();        // 恢复读取线程
}
  • 写入前确保读取线程已完全暂停。

  • 写入完成后恢复读取线程。

运行效果

[Read] 14:25:03.456 - Reading data...
[Read] 14:25:04.457 - Reading data...
[Write] Pause request sent.
[Write] Read thread paused. Starting write operation...
[Write] 14:25:05.457 - Write completed.
[Write] Read thread resumed.
[Read] 14:25:05.958 - Reading data...
[Read] 14:25:06.959 - Reading data...
...
Main thread exited.

方案特点

  1. 严格同步通过双重信号机制确保写入操作插入的安全性

  2. 无竞态条件:使用 ManualResetEventSlim 避免多线程竞争。

  3. 可控停止:通过 _stopRequested 安全终止线程。

相关文章:

  • 闲聊IT - 面向服务架构(SOA)的发展历史
  • Powershell 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
  • 【简单学习】Prompt Engineering 提示词工程
  • redis7.4.2单机配置
  • 安全上网沙箱:多方面解决政企私的上网问题
  • [AI速读]混合验证方案:如何高效解决RISC-V向量扩展的验证难题
  • 前端实现截图功能
  • 帕金森病致生活艰难,如何缓解心理负担?
  • 什么是ClickHouse
  • TDengine又新增一可视化工具 Perspective
  • SpringMVC配置和基本原理
  • 【PyTorch][chapter-39][MOE][Mixtral of experts -PyTorch】[4]
  • Python----计算机视觉处理(Opencv:图像亮度变换)
  • 页面只有一个搜索框 如何按下enter键阻止页面的提交表单默认行为
  • vue3 如何清空 let arr = reactive([])
  • css 控制彩带图片从左到右逐渐显示有画出来的感觉
  • linux如何释放内存缓存
  • (windows)conda虚拟环境下open-webui安装与启动
  • 为什么后端接口返回数字类型1.00前端会取到1?
  • 【颠覆性缓存架构】Caffeine双引擎缓存实战:CPU和内存双优化,命中率提升到92%,内存减少75%
  • 北京银行一季度净赚超76亿降逾2%,不良贷款率微降
  • 五一假期上海推出首批16条“市民健康路线”,这些健康提示请收好
  • 王毅:为改革完善全球治理作出金砖贡献
  • 费高云调研党的建设工作:营造风清气正劲足的政治生态
  • 2025上海体育消费节启动,多形式联动打造体育消费盛宴
  • 见证上海援藏30年成果,萨迦非遗珍品展来沪