C# 中的线程安全属性

2024-02-09

我正在尝试在 C# 中创建线程安全属性,并且我想确保我处于正确的路径上 - 这是我所做的 -

private readonly object AvgBuyPriceLocker = new object();
private double _AvgBuyPrice;
private double AvgBuyPrice 
{
    get
    {
        lock (AvgBuyPriceLocker)
        {
            return _AvgBuyPrice;
        }
    }
    set
    {
        lock (AvgBuyPriceLocker)
        {
            _AvgBuyPrice = value;
        }
    }
}

阅读这篇文章,这似乎不是正确的做法 -

C# 线程安全与 get/set https://stackoverflow.com/questions/505515/c-thread-safety-with-get-set

然而,这篇文章似乎另有暗示,

http://www.codeproject.com/KB/cs/Synchronized.aspx http://www.codeproject.com/KB/cs/Synchronized.aspx

有人有更明确的答案吗?

Edit:

我想为此属性执行 Getter/Setter 的原因是 b/c 我实际上希望它在设置时触发一个事件 - 所以代码实际上是这样的 -

public class PLTracker
{

    public PLEvents Events;

    private readonly object AvgBuyPriceLocker = new object();
    private double _AvgBuyPrice;
    private double AvgBuyPrice 
    {
        get
        {
            lock (AvgBuyPriceLocker)
            {
                return _AvgBuyPrice;
            }
        }
        set
        {
            lock (AvgBuyPriceLocker)
            {
                Events.AvgBuyPriceUpdate(value);
                _AvgBuyPrice = value;
            }
        }
    }
}

public class PLEvents
{
    public delegate void PLUpdateHandler(double Update);
    public event PLUpdateHandler AvgBuyPriceUpdateListener;

    public void AvgBuyPriceUpdate(double AvgBuyPrice)
    {
        lock (this)
        {
            try
            {
                if (AvgBuyPriceUpdateListener!= null)
                {
                    AvgBuyPriceUpdateListener(AvgBuyPrice);
                }
                else
                {
                    throw new Exception("AvgBuyPriceUpdateListener is null");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

我对使我的代码线程安全还很陌生,所以请随时告诉我我是否以完全错误的方式进行操作!

Will


正如您所写的那样,锁是毫无意义的。例如,读取变量的线程将:

  1. 获取锁。
  2. 读取值。
  3. 释放锁。
  4. 以某种方式使用读取值。

在步骤 3 之后,没有什么可以阻止另一个线程修改该值。由于 .NET 中的变量访问是原子的(请参见下面的警告),因此锁实际上并没有实现太多目的:只是增加了开销。与解锁示例对比:

  1. 读取值。
  2. 以某种方式使用读取值。

另一个线程可能会更改步骤 1 和步骤 2 之间的值,这与锁定示例没有什么不同。

如果要确保在进行某些处理时状态不会改变,则必须读取该值并使用该值进行处理在锁的上下文中:

  1. 获取锁。
  2. 读取值。
  3. 以某种方式使用读取值。
  4. 释放锁。

话虽如此,在某些情况下,您在访问变量时需要锁定。这些通常是由于底层处理器的原因造成的:double例如,变量不能作为 32 位机器上的单个指令进行读取或写入,因此您必须锁定(或使用替代策略)以确保不会读取损坏的值。

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

C# 中的线程安全属性 的相关文章

随机推荐

  • UserControl 和 Window 的一个 ViewModel 或单独的 ViewModel

    I have MainWindow and AddEdit UserControl 里面MainWindow我渲染这个 AddEdit 就像
  • 通过排除字段使用更新视图 django 编辑模型对象

    我在尝试着Edit Update使用 django 的模型对象 记录 Updateview model py from django db import models from myapp models import Author clas
  • Laravel Eloquent:如何将 whereDate 与 Between 一起使用?

    我正在使用 Laravel 5 5 我需要形成一个查询 其中仅应匹配日期时间列的日期部分 相当于date date col 2018 01 01 之类的事情 我如何以雄辩的方式实现这一目标 WhereDate 返回日期部分 但有什么方法可以
  • Java 8:从列表中查找最小值的索引

    假设我有一个包含元素的列表 34 11 98 56 43 使用 Java 8 流 如何找到列表中最小元素的索引 例如本例中为 1 我知道这可以在 Java 中轻松完成list indexOf Collections min list 然而
  • Swift UI 被高频 @StateObject 更新淹没了吗?

    Scenario 一个简单的 SwiftUIApp由一个TabView有两个选项卡 这App结构体有一个 StateObject属性 该属性正在重复且非常快速地 每秒 30 次 更新simulateFastStateUpdate 在这个例子
  • WinForms Tab控件问题

    我有一个以两种模式显示的表单 切换模式完全改变了表单的外观 就像您使用选项卡控件并且每个选项卡上的控件布局不同一样 如果我可以隐藏选项卡本身 选项卡控件将是完美的 当然 我可以使用两个面板并以编程方式显示和隐藏适当的面板 我尝试了这个 但我
  • 在 log4j xml 配置中使用系统环境变量

    是否可以在 log4j xml 配置文件中引用系统环境变量 而不是 Java 系统属性 我希望能够做类似的事情
  • Debian sid下RStudio安装失败:libgstreamer依赖问题

    我使用 Debian sid amd64 每周滚动更新一次 我最近从他们的官方网站下载了 RStudio 的桌面版本 0 99 902 并发布 当然 以 root 身份 dpkg i rstudio 0 99 902 amd64 deb 无
  • Web Scraper:限制单个域上每分钟/小时的请求数?

    我正在与一位图书管理员合作 重新构建其组织的数字摄影档案 我用Python构建了一个机器人机械化 http wwwsearch sourceforge net mechanize and 美丽汤 http www crummy com so
  • NSCoder vs NSDictionary,什么时候用什么?

    我想弄清楚如何决定何时使用 NSDictionary 或 NSCoder NSCoding 似乎对于一般属性列表等 NSDictionary 是生成可在应用程序外部轻松编辑的 XML 文件的简单方法 当处理保存数据的自定义类或可能嵌套在其中
  • ServiceId.UniqueId 最大长度和格式

    Every Item http msdn microsoft com en us library microsoft exchange webservices data item 28v exchg 80 29 aspx e g Task
  • 设置内容视图不起作用

    button setOnClickListener new View OnClickListener public void onClick View v setContentView R layout activity chart 您好
  • Android NDK 中的调试与发布构建

    我正在开发一个必须移植到 Android 的大型游戏引擎 所有代码都是 C C 因此我们通过 NDK 进行移植 我已经构建了所有内容 但经过大量搜索后 我仍然不确定构建 so 文件的调试版本与发布版本的最佳方法是什么 每次都用手改变东西已经
  • 如何在张量流中将 2d 张量与 3d 张量相乘?

    In numpy您可以将 2d 数组与 3d 数组相乘 如下例所示 gt gt gt X np random randn 3 5 4 3 5 4 W np random randn 5 5 5 5 out np matmul W X 3 5
  • Objective-C 在 dealloc 中保留计数

    我在这里看到一些相当奇怪的东西 我在不同的地方设置了断点dealloc我的应用程序中的方法 并在检查时 对象的保留计数self从 1 到 0 变化 当dealloc被调用时 对象的保留计数是否已被设置为0 我在用着print int sel
  • 找到control m字符并将其删除

    是否有任何单行命令可以递归地查找所有目录中的 ctl 文件并从中删除 control m 字符 Use find with sed 使用 GNU sed find name ctl type f exec sed i s M 对于 BSD
  • 到达代码,不执行并无错误退出

    到目前为止 我的所有代码都运行良好 using System Diagnostics namespace WebPortalLogging public static class EventLogging public static voi
  • 通过 HttpURLConnection 发送 UTF-8 字符失败

    我已经花了半个星期天的时间来解决这个问题 现在我需要帮助 我想使用 Java HttpURLConnection 将包含特殊字符 UTF 8 编码的字符串发送到服务器 字符的正确编码失败 Example strToSend strUrlEn
  • Laravel 全文搜索

    我正在尝试对数据库实施全文搜索查询 这是我的客户发给我的规范 The free text search limits the result of the data table to records with a matching first
  • C# 中的线程安全属性

    我正在尝试在 C 中创建线程安全属性 并且我想确保我处于正确的路径上 这是我所做的 private readonly object AvgBuyPriceLocker new object private double AvgBuyPric