在为简单程序创建库时,使其线程安全是否更符合成本效益,还是有一种方法可以检测程序在多线程程序中的使用,并断言()或以其他方式确定(最好是在编译或链接时)它可能会造成问题。
对此问题的相关帮助将是自动工具支持,用于查找线程安全方面的潜在问题,以及执行该问题的编程语言特性,
发布于 2012-09-19 00:32:19
这取决于使线程安全的成本(在开发时间和精力方面)。需要考虑的事项包括:
synchronized和C#'s lock关键字)时,效率或速度至关重要。它还取决于库在多线程环境中使用的可能性以及所使用的语言的约定。例如,微软的原始类库设计指南指出,非静态成员不必是线程安全的。。
无论哪种方式,最好的方法是清楚地记录什么是线程安全的,什么是不安全的。
发布于 2012-09-14 20:10:20
所以我想这是对使用图书馆的人的警告。
是的,这正是我尖刻的评论。除非有充分的理由增加这笔费用,否则不要这样做。对于设计人员、开发人员、测试人员以及不需要线程安全的用户来说,线程安全都是昂贵的。除非有一个非常好的理由来承担这一费用,否则你是错误的过早优化。
rand()函数一样有用。您构建线程安全是因为它是有意义的,也是因为需要它,而且即使这样,您也需要对您的处理方式保持明智的态度。
发布于 2012-09-14 16:38:15
像这样的东西(C#)可能会起作用.
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线程,很可能是应用程序的“主”线程)。
但是,总的来说,如果您希望您的库被进程的并行线程使用,并且希望支持它,我将使它成为线程安全的。这并不难;使用监视器、互斥锁或其他锁来保护共享状态,并倾向于不依赖于实例作用域状态的“纯函数”。
https://softwareengineering.stackexchange.com/questions/164913
复制相似问题