首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当为一个简单的程序创建一个库时,我必须做些什么来保护其他人不受线程安全的影响?

当为一个简单的程序创建一个库时,我必须做些什么来保护其他人不受线程安全的影响?
EN

Software Engineering用户
提问于 2012-09-14 16:20:55
回答 4查看 685关注 0票数 2

在为简单程序创建库时,使其线程安全是否更符合成本效益,还是有一种方法可以检测程序在多线程程序中的使用,并断言()或以其他方式确定(最好是在编译或链接时)它可能会造成问题。

对此问题的相关帮助将是自动工具支持,用于查找线程安全方面的潜在问题,以及执行该问题的编程语言特性,

EN

回答 4

Software Engineering用户

回答已采纳

发布于 2012-09-19 00:32:19

这取决于使线程安全的成本(在开发时间和精力方面)。需要考虑的事项包括:

  • 使库线程安全可能是一项挑战,特别是在处理低级线程原语(如synchronized和C#'s lock关键字)时,效率或速度至关重要。
  • 一些环境提供了更高层次的抽象,比如C# 4.5's、等待与异步关键字。如果可以的话就用吧。
  • 使用线程安全库类,如.NET的System.Collections.Concurrent命名空间中的类。
  • 线程安全可能会影响代码的可移植性。例如,如果没有额外的库支持,使用丝线互斥的C代码将无法在Windows上工作。

它还取决于库在多线程环境中使用的可能性以及所使用的语言的约定。例如,微软的原始类库设计指南指出,非静态成员不必是线程安全的。

无论哪种方式,最好的方法是清楚地记录什么是线程安全的,什么是不安全的。

票数 1
EN

Software Engineering用户

发布于 2012-09-14 20:10:20

所以我想这是对使用图书馆的人的警告。

是的,这正是我尖刻的评论。除非有充分的理由增加这笔费用,否则不要这样做。对于设计人员、开发人员、测试人员以及不需要线程安全的用户来说,线程安全都是昂贵的。除非有一个非常好的理由来承担这一费用,否则你是错误的过早优化。

  • 很好的理由:您是一个日志库的开发人员,其中一个日志记录项可能包含日志文件中的许多行,而记录器可能会从多个线程调用。对线程安全的需求就在需求中,而这些需求是有意义的。
  • 不好的原因:在日志库上做得很好之后,您就会成为项目负责人,除其他外,您将开发一个随机数库。这里的驱动要求是数字正确性、易用性和速度。项目负责人您决定将线程安全性添加到需求中,因为确保线程安全在日志库项目中非常有趣。你刚刚让我对速度的需求消失了。我可能会在一夜蒙特卡罗运行期间给PRNG打数以万亿计的电话。您的库对我来说和内置的rand()函数一样有用。

您构建线程安全是因为它是有意义的,也是因为需要它,而且即使这样,您也需要对您的处理方式保持明智的态度。

票数 13
EN

Software Engineering用户

发布于 2012-09-14 16:38:15

像这样的东西(C#)可能会起作用.

代码语言:javascript
复制
public class MyNonThreadSafeClass()
{
   public MyNonThreadSafeClass()
   {
       currentThreadId = Thread.CurrentThread.ManagedThreadId;
   }

   private readonly int currentThreadId;

   public void SomeNonThreadSafeMethod()
   {
      AssertSameThread();

      //do your thing   
   }

   private void AssertSameThread()
   {
      if(currentThreadId != Thread.CurrentThread.ManagedThreadId)
         throw new InvalidOperationException("Method must be called on the same thread that created the containing object");
   }
}

这将确保只有创建对象实例的线程才能使用它。这种变化可以确保没有一个方法同时被不同的线程并发调用(但是允许一个线程创建实例,然后将它交给另一个线程来处理),或者创建线程必须有一个消息泵(因此它是UI线程,很可能是应用程序的“主”线程)。

但是,总的来说,如果您希望您的库被进程的并行线程使用,并且希望支持它,我将使它成为线程安全的。这并不难;使用监视器、互斥锁或其他锁来保护共享状态,并倾向于不依赖于实例作用域状态的“纯函数”。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/164913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档