.NET 多线程变量访问

2024-04-16

我有一个有 4 个线程的应用程序。 (GUI、控制器、生产者、消费者)

GUI 是不言自明的。

控制器在进行一些初始设置后启动生产者和消费者线程。

生产者创建项目并将它们放置在“环形缓冲区”的空闲槽中

消费者从“环形缓冲区”中取出项目并将其写入磁盘。

生产者创造物品的速度比消费者高得多。

消费者是 IO 重且受 IO 约束的。

目前,我正在检查每个环形缓冲区插槽中的变量以确定是否可以写入它。



if Slot.Free then
  Write Slot.Data To Disk
end if
  

我没有使用锁/同步锁,而是只是读取/写入插槽的“自由”变量的值。我不认为这是正确的,即使它是易失性读/写。有没有更好的方法来读/写这个变量?该变量的类型为“整数”,并且为 0 或 1。


您提到使用环形缓冲区,但是(正确实现的)环形缓冲区将能够确定它是否已满,而无需检查其所有元素,从而无需在每个插槽中使用布尔值。

我不习惯 VB.NET,但这应该是环形缓冲区的一个工作(如果粗略)实现,当相应的写入/读取操作已满/空时,该缓冲区会阻塞。

Friend Class RingBuffer(Of T)
    Private _slots() As T
    Private _head As Integer
    Private _tail As Integer

    Private _readableSlots As Semaphore
    Private _readLock As Object
    Private _writableSlots As Semaphore
    Private _writeLock As Object

    Public Sub New(ByVal size As Integer)
        ReDim _slots(size - 1)

        _head = 0
        _tail = 0
        _readLock = New Object
        _writeLock = New Object

        _readableSlots = New Semaphore(0, size)
        _writableSlots = New Semaphore(size, size)
    End Sub

    Public Function Dequeue() As T
        Dim item As T
        _readableSlots.WaitOne()
        SyncLock _readLock
            item = _slots(_head)
            _head = (_head + 1) Mod _slots.Length
        End SyncLock
        _writableSlots.Release()
        Return item
    End Function

    Public Sub Enqueue(ByVal item As T)
        _writableSlots.WaitOne()
        SyncLock _writeLock
            _slots(_tail) = item
            _tail = (_tail + 1) Mod _slots.Length
        End SyncLock
        _readableSlots.Release()
    End Sub
End Class

一旦你有了这个,你的生产者和消费者可能真的很愚蠢:)如果你有多个消费者,则不能完全保证项目按顺序处理:

Private _buffer As RingBuffer(Of Integer) = New RingBuffer(Of Integer)(5)

Private Sub Producer()
    Dim i As Integer = 0
    Do While True
        _buffer.Enqueue(i)
        i = i + 1
    Loop
End Sub

Private Sub Consumer()
    Do While True
        Debug.WriteLine(("Consumer A: " & _buffer.Dequeue))
        Thread.Sleep(1000)
    Loop
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET 多线程变量访问 的相关文章

  • 异步回调在哪个线程上运行?

    我正在做几个HttpWebRequest BeginGetResponse调用 并在回调方法中BeginGetResponse 我正在调用一个事件处理程序 在EventHandler中 有测试下载是否成功的逻辑 如果没有 它会尝试重新下载
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • 赋值运算符“=”是原子的吗?

    我正在使用全局变量实现线程间通信 global var volatile bool is true true thread 1 void thread 1 while 1 int rint rand 10 if is true cout l
  • 导致崩溃转储的 Java 错误的解决方法

    我开发的一个程序偶尔会由于这个错误而导致 JVM 崩溃 http bugs java com bugdatabase view bug do bug id 8029516 http bugs java com bugdatabase vie
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • Android:如何使用后台线程?

    我开发了一个应用程序 它从互联网获取内容并相应地在设备的屏幕上显示它 该程序运行得很好 就是有点慢 加载并显示内容大约需要 3 4 秒 我想将获取内容并将其显示在后台线程中的所有代码放在一起 当程序执行这些功能时 我想显示一个进度对话框 你
  • 项目:为了评估索引属性,该属性必须经过限定,并且参数必须由用户显式提供。

    我创建了多个组合框 从中我从创建的存储过程中提取了每个组合框的数据 所有这些框一直工作到今天早些时候 其中 2 个组合框停止工作 检查行的 立即窗口 和列 我得到了列的结果 但是当我检查列时 例如 dsContactTitles Table
  • 需要从 DCOM 配置中删除对象 (DCOMCNFG)

    我们有一个带有 activex exe 和 com dll 的应用程序 安装后 我们会在 DCOM 配置中创建一个对象 如果我们尝试从 DCOM 配置中删除该对象 它就会关闭 直到我们再次重新打开它 想知道是否有任何程序可以从 DCOM 及
  • 为什么 gcc 链接时没有 lpthread 标志?

    我当时正在做一个业余爱好项目 其中互斥体的行为很神秘 我将其归结为这个显然应该陷入僵局的测试用例 include
  • 从字体到跨度(大小和颜色)和背面的正则表达式(VB.NET)

    我正在寻找一个正则表达式 可以将我的字体标签 仅具有大小和颜色属性 转换为具有相关内联CSS的span标签 如果有帮助的话 这将在 VB NET 中完成 我还需要一个正则表达式来实现相反的效果 下面详细说明的是我正在寻找的转换示例 font
  • 设置国际货币格式

    我有一个 asp net 应用程序 我们正在 全球化 过程中 我将 currentculture 和 currentUICultre 设置为适当的值 并且货币按预期使用货币格式显示 即 FormatCurrency nPrice 产生 en
  • 异步多播委托

    我最近在一个广泛使用事件的项目上做了一些工作 我需要做的事情之一是在多播委托上异步调用多个事件处理程序 我认为诀窍是对 GetInvocableList 中的每个项目调用 BeginInvoke 但似乎那里不存在 BeginInvoke 有
  • 有没有更简单的方法来处理复选框?

    在 vb net 中 我有一个包含一组四个复选框的表单 每个复选框都表示 选中时 用户想要向其订单添加特殊指令 代码如下所示 If SpecialInstruction1CheckBox Checked Then AddSpecialIns
  • 任务并行库周围是否有一个接口包装器,以便我可以将其交换用于单元测试?

    I asked 这个问题 https stackoverflow com questions 3362734 unit testing concurrent software what do you do不久以前 我现在知道这是一个坏主意
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • 纯 Haskell 代码需要线程池吗?

    In 现实世界 Haskell 第 28 章 软件事务内存 http book realworldhaskell org read software transactional memory html 开发了一个并发网络链接检查器 它获取网
  • 更改组合框下拉列表边框的颜色

    My code Private Sub ComboBox2 DrawItem sender As Object e As DrawItemEventArgs Handles ComboBox2 DrawItem If e Index lt
  • 报告线程进度的最佳方式

    我有一个程序 它使用线程顺序执行耗时的进程 我希望能够监视每个线程的进度 类似于BackgroundWorker ReportProgress ProgressChanged模型确实如此 我不能使用ThreadPool or Backgro
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH

随机推荐

  • 如何在 iPhone 上的 ViewController 之间共享对象?

    我的应用程序是一个选项卡栏应用程序 每个选项卡都有一个单独的视图控制器 我的第一个视图控制器 A 中有一个对象 其中包含我存储的所有应用程序数据 请忽略 NSUserDefaults 当我按下第二个视图控制器 B 上的按钮时 需要由第二个视
  • 在 Spark 中,从哈希映射创建数据帧,其中键作为列名称,值作为行

    我有一个数据框 我有一个列 它是数据框中的地图 如下所示 scala gt df printSchema root A1 map nullable true key string value string valueContainsNull
  • 无法从 vs 2015 安装程序安装 xamarin

    我安装了 vs 2015 升级 1 并尝试从设置中安装 Xamarin 但是当我尝试安装它时 最后收到此错误消息 C Net Xamarin 安装程序在安装此软件包时遇到意外错误 这可能表明软件包有问题 错误代码为2711 我该如何解决这个
  • 订购 NSURL 数组

    我正在将大量图像路径加载到 NSURL 中 这些图像位于按 1 PNG 2 PNG 3 PNG 到 1500 PNG 顺序排列的文件夹中 当我尝试加载它们时 let imagePath path images let url NSURL f
  • 扩展 ActiveStorage::Attachment - 添加自定义字段

    我想扩展 ActiveStorage Attachment 类并添加一个枚举属性以实现附件的可见性 我最初的方法是在 app models 目录中创建一个新文件attachment rb 如下所示 class ActiveStorage A
  • 如何使用 Odoo 从表单字段获取值?

    我在表单视图中有这个字段
  • 测试入口点贡献

    我正在编写一个指定一组入口点的 Python 模块 以便其他主机模块可以发现新的功能 我正在遵循指定的 setuptools 方法官方文档 https setuptools readthedocs io en latest userguid
  • Python - 使 gspread.service_account 采用 python 字典或字符串而不是文件名

    我目前正在使用 google Sheets 并正在使用 python 库gspread使其自动化 我的代码的第一行是导入 gspread 库并使用以下命令登录到服务帐户service account json谷歌控制台给我们的文件 impo
  • TypeScript/TSLint:TSLint 无法通过 baseUrl 识别根相对导入

    我通过以下方式使用根相对导入baseUrl编译器选项在tsconfig json 按照这个解决方案 https stackoverflow com a 42306860 1253298 但我遇到了一个问题 Atom IDE 向我显示如下所示
  • 有没有办法使用 Cereal / C++ 为 std::map 指定更简单的 JSON(反)序列化?

    我正在从事的项目是一个管理大量自定义硬件设备的 C 应用程序 该应用程序有一个供客户端使用的套接字 端口接口 如 GUI 每种设备类型都有自己定义良好的 JSON 模式 我们可以使用 Cereal 来序列化这些模式 但应用程序还需要解析来自
  • 了解 T-SQL stdev、stdevp、var 和 varp

    我很难理解这些统计函数的作用以及它们的工作原理 我很难理解 stdev 与 stdevp 以及 var 等价物的工作原理 有人可以帮我把这些分解成愚蠢的吗 在统计学中 标准差和方差是衡量总体中的指标偏离平均值 通常是平均值 的程度 标准差定
  • 违反 - 未找到父键错误

    我出现以下错误 INSERT INTO GroupMembers VALUES Goldfrat Simon Palm ERROR at line 1 ORA 02291 integrity constraint SHAHA1 IAM IS
  • VS2010/C#4 的 C# 编译器错误 CS1628

    此编译器错误列在 C 编译器错误中MSDN http msdn microsoft com en us library we3011f5 28v vs 90 29 aspx适用于 VS2005 和 VS2008 但不适用于较新的版本 这会让
  • iOS VoiceOver“找不到标题”

    我有一个 UITableView 其中每个 UITableViewCell 有 2 个 UILabels 1 个标题和 1 个内容 标头的 AccessibilityTrait 设置为 header 使用辅助功能检查器检查模拟器屏幕时 我能
  • 如何在React功能组件中添加事件

    我有一个关于 React 函数式组件的问题 特别是关于函数式组件中的函数的问题 例如 import React useEffect from react const Component props gt useEffect gt windo
  • 扫描新指纹时如何触发KeyPermanentlyInvalidatedException

    如上所述here https stackoverflow com a 44926774 3142611 我正在尝试触发KeyPermanentlyInvalidatedException当新的指纹添加到设备但未触发此异常时 MyCode F
  • Python 中可用和已使用的系统内存? [复制]

    这个问题在这里已经有答案了 如何从 Python 获取可用和当前使用的内存 它需要是跨平台的 并且至少可以在 Windows Mac OS X 和 Linux 上运行 我想向我的应用程序中的用户报告没有足够的可用内存来继续 你应该看看psu
  • 使用 XSLT 转换 XML 时保留实体引用?

    使用 XSLT 2 0 转换 XML 时如何保留实体引用 对于我尝试过的所有处理器 默认情况下都会解析实体 我可以用xsl character map处理字符实体 但是文本实体呢 例如 这个 XML gt
  • C# Datagridview 不对 Checkbox 列进行排序

    当我将 Linq to sql 查询绑定到 datagridview 在其间使用 BindingSource 时 默认情况下这些列是可排序的 然而 布尔类型似乎并非如此 对于这些 datagridview 使用复选框列 但是当我单击标题时没
  • .NET 多线程变量访问

    我有一个有 4 个线程的应用程序 GUI 控制器 生产者 消费者 GUI 是不言自明的 控制器在进行一些初始设置后启动生产者和消费者线程 生产者创建项目并将它们放置在 环形缓冲区 的空闲槽中 消费者从 环形缓冲区 中取出项目并将其写入磁盘