锁助手的线程安全使用(关于内存屏障)

2023-12-01

我所说的锁定助手指的是一次性对象,可以通过它来实现锁定using声明。例如,考虑一个典型的用法SyncLock班级来自乔恩·斯基特的 MiscUtil:

public class Example
{
    private readonly SyncLock _padlock;

    public Example()
    {
        _padlock = new SyncLock();
    }

    public void ConcurrentMethod()
    {
        using (_padlock.Lock())
        {
            // Now own the padlock - do concurrent stuff
        }
    }
}

现在,考虑以下用法:

var example = new Example();
new Thread(example.ConcurrentMethod).Start();

我的问题是这样的 - 因为example在一个线程上创建并且ConcurrentMethod被另一个人调用,不能ConcurrentMethod的话题被忽视_padock构造函数中的赋值(由于线程缓存/读写重新排序),因此抛出NullReferenceException (on _padLock本身)?

我知道锁定Monitor/lock具有内存屏障的好处,但是当使用诸如此类的锁助手时,我不明白为什么可以保证这样的屏障。在这种情况下,据我了解,必须修改构造函数:

public Example()
{
    _padlock = new SyncLock();
    Thread.MemoryBarrier();
}

Source: 了解多线程应用程序中低锁技术的影响

EDITHans Passant 认为线程的创建意味着内存屏障。那么怎么样:

var example = new Example();
ThreadPool.QueueUserWorkItem(s => example.ConcurrentMethod());

现在不一定要创建线程......


不,您不需要做任何特殊的事情来保证创建内存屏障。这是因为几乎所有用于让方法在另一个线程上执行的机制都会产生一个释放栅栏调用线程上的屏障和获取栅栏工作线程上的屏障(实际上它们可能是完整的栅栏屏障)。所以要么QueueUserWorkItem or Thread.Start会自动插入必要的障碍。您的代码是安全的。

另外,作为切向利益的问题Thread.Sleep还会产生内存屏障。这很有趣,因为有些人天真地使用Thread.Sleep模拟线程交错。如果此策略用于解决低锁代码问题,那么它可以很好地掩盖您试图查找的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

锁助手的线程安全使用(关于内存屏障) 的相关文章

  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 使用 C# 读取 Soap 消息

  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看

随机推荐

  • 从字符串获取 DbSet

    ADO NET 用户首次尝试 EF 我正在尝试从表名字符串中获取一个表 比我想象的还要难 基本上我在这里 var tableName Name Entities Measure measureType var table Activator
  • 如何将 JSON api 日期与 FSCalendar 进行比较并在表格视图中显示事件?

    我在日历中显示了事件点 但无法根据表格视图中的月份显示相同的事件 我想显示这些事件 例如如果我们更改月份并且表格视图数据事件应该更改 我很困惑如何做到这一点 我正在使用 FSCalendar 来显示 dot 和 tableview 等事件
  • 如何重新安装 NetBeans?所有可用组件(包和运行时)都已安装,如何继续?

    NetBeans 重新安装出现问题 第一个工作正常 所有可用组件均已安装 单击 取消 退出安装程序 没办法继续下去了 之前 我使用 全部 完整下载选项 215 MB 下载并安装了 NetBeans IDE 8 1 的窗口版本 其中包含 Ne
  • iText - 可点击的图像应该打开 MS Word 附件

    如何使图像可点击以便打开附加的 ms word 文档 我这里有一些 PDF 其中有一些图像 ms word 图标 图标下方有 ms word 文件名 通过单击图像打开附加的 ms word 文档 我想知道如何使用 iText 库执行此操作
  • 为什么有些人在循环宏的子句中使用关键字?

    它能解决任何问题吗 根据 PCL 的第一个脚注 如果不是关键字 它会将符号保留在当前包中 由于所有关键字都被保留在关键字包中 因此可以防止多个符号被保留在不同的包中 但还有其他优点吗 它会产生什么问题 我猜一定有问题 因为这不是普遍的惯例
  • 极坐标图中的箭头

    我试图绘制串联 R L C 电路中电阻器 电容器和电感器两端电压的相量 我已经完成了所有的计算 我可以用正常的方式得到一个像样的图ax plot theta r 我想让相量向量看起来像箭头 我一直在尝试使用ax arrow 0 0 thet
  • 为什么需要 Lambda 函数将值传递给 @onclick 调用的方法?

    我是 Blazor 以及一般的 Web 开发人员 的新手 我跟着Microsoft 的 Blazor Web 应用程序待办事项列表教程 在完成上述教程后 我想进一步在每个列表元素旁边添加按钮以将它们从列表中删除 这是我为实现这一目标而编写的
  • 使用Postman发送PATCH到Asp.net Core webapi时出错

    我有一个模型 public class Order public Guid Id get set public IEnumerable
  • matplotlib twinx 在循环内

    我有一个循环 在特定条件下 例如出现 3 次 我想用 twinx 绘制两个数据集 所以例如最后我在左 y 上有 3 个图 在右 y 上有 3 个图 当我使用通常的 twinx 时 循环的右 y 值不正确 我应该如何修改此示例代码才能使其正确
  • 何时要求子句表达式需要加括号? (偶然的双关语)

    这给出了一个错误 template
  • document.getElementById 替换 angular4 / typescript 中的?

    我在实践工作中使用 Angular4 这对我来说是新的 为了获取 HTML 元素及其值 我使用了
  • 如何在ListView列表项中添加节标题

    我想开发 国家历史 Android应用程序 但我有一个问题 我无法将国家 地区标题放入列表视图列表项中 我想放标题 例如 非洲 北非 撒哈拉以南非洲 亚洲 北亚 西亚和中亚 南亚和东南亚 欧洲 北美和中美洲 北美洲 大洋洲 南美洲 这是我的
  • 如何用多个分隔符分割字符串并保留分隔符?

    我有例如这个字符串 abc 现在 我想把它分成 分隔符 我知道我可以使用 String split 来实现这一点 但有没有办法可以通过这个符号来分割 if 但又不会丢失它 就像如果我使用 split 我会得到这个string abc 而且我
  • 用于维护计数器和聚合的 Firebase 控制服务器

    It s a 已知问题firebase 没有简单的方法来计算项目 我计划创建一个严重依赖计数和其他聚合的应用程序 我担心按照建议的规则创建此应用程序的计数器here将非常复杂且难以维护 所以我想到了这个模式 我将保留一个服务器来侦听数据库中
  • 强制 Sympy 在 MathJax Jupyter 中打印数学

    我正在使用 VSCode 和 Jupyter 来处理 Sympy 通常 它以 MathJax 格式打印数学方程 sympy 文档说 在IPython笔记本中 它将使用MathJax来渲染LATEX MathJax 输出 但是 当我安装 ma
  • 捕获 Mysqli 错误

    我定义了一个自定义错误处理程序 它捕获所有异常并将它们保存到日志中 现在 如果我在 mysqli 查询中出现语法错误 例如拼写错误 页面将在此时完全停止加载 不会引发异常 因此不会触发错误处理程序并且不会记录任何内容 这是正常的吗 我应该检
  • 如何渐变填充按钮的背景?

    我必须创建一个带有渐变填充的彩色按钮 从按钮的中间沿 Y 轴开始 如果我将按钮的背景属性设置为我想要的颜色 我会丢失rounded按钮的外观和感觉以及渐变填充 它看起来像TextView有背景 另外 我希望当用户按下按钮时改变这种颜色 我可
  • 在 jquery ajax 中使用动态数据实现自动完成

    我在 ASP Net MVC 应用程序中使用 Materialize ui 并且使用带有动态数据的自动完成控件 这是我的代码 div class row div class col s12 div class row div class i
  • 节点 module.exports 返回未定义

    我在使用 Node js 时遇到问题module exports 我明白那个module exports是返回一个对象的调用 该对象具有为其分配的任何属性 如果我有这样的文件结构 formatting js function Format
  • 锁助手的线程安全使用(关于内存屏障)

    我所说的锁定助手指的是一次性对象 可以通过它来实现锁定using声明 例如 考虑一个典型的用法SyncLock班级来自乔恩 斯基特的 MiscUtil public class Example private readonly SyncLo