Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哪些特性使类成为线程安全的?_C#_Multithreading_Thread Safety - Fatal编程技术网

C# 哪些特性使类成为线程安全的?

C# 哪些特性使类成为线程安全的?,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,在MSDN中,某些.NET类的描述如下: “此类型是线程安全的。” 或 “此类型的公共静态(在Visual Basic中共享)成员是线程安全的。不保证实例成员是线程安全的。”。 我的问题是,哪些特性使类成为线程安全的 螺纹安全编程是否有任何标准、建议或指南 当我使用lock(C#)关键字时,它意味着我的类是否是线程安全的 如何评估类的线程安全性?是否有任何测试来确保类是100%线程安全的 例如: public class MyClass { public void Method()

在MSDN中,某些.NET类的描述如下:

此类型是线程安全的。

此类型的公共静态(在Visual Basic中共享)成员是线程安全的。不保证实例成员是线程安全的。”。

我的问题是,哪些特性使类成为线程安全的

  • 螺纹安全编程是否有任何标准、建议或指南

  • 当我使用lock(C#)关键字时,它意味着我的类是否是线程安全的

  • 如何评估类的线程安全性?是否有任何测试来确保类是100%线程安全的

例如:

public class MyClass
{
    public void Method()
    {
        lock (this)
        {
            // Now, is my class 100% thread-safe like Microsoft classes?
        }
    }
    type m_member1;
    type m_member2;
}

感谢

如果一个类的方法可以由多个线程同时调用,而不会损坏该类的状态或造成意外的副作用,那么该类通常被认为是线程安全的。类可能不是线程安全的原因有很多,尽管一些常见的原因是它包含一些在并发访问时会损坏的状态

有许多方法可以使类线程安全:

  • 使其不可变,如果一个类不包含任何状态,则可以从多个线程并发使用它
  • 使用锁定来减少并发性。然而,这并不能保证线程安全,它只是确保一个代码块不会被多个线程并发执行。如果在方法调用之间存储状态,这可能仍然会变得不一致
  • 如何创建线程安全类实际上取决于要对所讨论的类执行什么操作


    你还需要问自己,我需要让我的类线程安全吗?大多数UI框架的一个常见模型是只有一个UI线程。例如,在WinForms、WPF和Silverlight中,大部分代码将从UI线程执行,这意味着您不必将线程安全性构建到类中。

    首先,不要使用锁(this)

    这可能导致死锁。因为其他代码可以从类的作用域之外锁定相同的对象。您应该创建一个本地对象,并将其用作类的锁

    其次,线程安全是一个复杂的问题。网上有很多关于这个的资料


    根据经验,所有的公共方法都应该被锁定并且线程安全,这样类才是线程安全的。

    如果一次只有一个线程可以修改从该类创建的对象的状态,或者该类提供了这样的功能,即多个线程可以同时调用该类的各种方法,则该类被认为是线程安全的。

    使用lock(C#)关键字,这意味着我的类是否是线程安全的? 当您使用lock时,这意味着锁
    {}
    中的代码部分是线程安全的。它不能保证你的类是线程安全的。正如Yochai Timmer所说,
    锁定(这个)

    如何评估类的线程安全性?是否有任何测试来确保类是100%线程安全的? 我不确定是否有任何测试,因为在多线程中,您总是有可能偶然得到正确的结果。因此,为了确保类的代码是线程安全的,您可以查看类的代码,非常简单的解释如下: 线程安全类型意味着您在使用类型时不需要任何额外的同步机制。假设您可以创建一个实例,将引用传递给另一个线程(或多个线程),并使用两个线程中的方法/属性,而不需要额外的线程安全开销

    是否有关于螺纹安全的标准、建议或指南 编程

    最重要的标准是确保所有静态成员都是线程安全的。您将看到,所有编写良好的API(包括.NET基类库)都全面保证了这一点。这是一个很好的理由。由于静态成员是跨AppDomain共享的,因此许多不同的线程都可以使用它们,而您甚至没有意识到这一点。为每一个静态成员访问提供自己的同步充其量也会很尴尬。想象一下,如果
    Console.WriteLine
    不是线程安全的,会是什么样子

    就建议和指导原则而言,有很多行之有效的并发编程模式。现有的模式涵盖了各种各样的编程问题,并使用了许多不同的同步机制。生产者-消费者模式是许多众所周知的模式之一,它恰好解决了大部分并发编程问题

    阅读。这是一个最好的和最审查的资源可用

    当我使用lock(C#)关键字时,它意味着我的类是否是线程安全的

    不!没有什么灵丹妙药可以使类线程安全。
    lock
    关键字只是许多不同工具中的一个,这些工具可以使一个类对于多个线程同时访问是安全的。但是,仅仅使用
    并不能保证任何事情正确使用同步机制可以使代码线程安全。错误使用这些机制的方法很多

    如何评估类的线程安全性?有什么测试要做吗 确定一个类是100%线程安全的吗


    这是一个百万美元的问题!测试多线程代码非常困难。Microsoft Research提供的工具是让并发程序员的生活更轻松的一种尝试。

    线程安全意味着当类的某个实例在多个线程之间共享时,没有两个线程可以同时更改该类的某个部分,从而导致数据损坏。
    lock(此)
    意味着它不是死锁安全的。你可能会发现Eric Lippert的这篇博文很有趣:简而言之,就是这样