如何定义线程安全?

时间:2010-01-04 12:00:20

标签: multithreading definition

Threadsafe是一个围绕文档抛出的术语,但很少有解释它的含义,特别是对于第一次学习线程的人来说可以理解的语言。

那你如何向新线程解释者Threadsafe解释? 我对选项的想法是:

  • 您是否使用了代码的列表 线程安全与线程不安全
  • 图书定义
  • 一个有用的比喻

8 个答案:

答案 0 :(得分:14)

多线程导致非确定性执行 - 您不确切知道何时运行某段并行代码。

鉴于此,这个精彩的multithreading tutorial定义了线程安全,如下所示:

  

线程安全代码是面对任何多线程场景都没有不确定性的代码。主要通过锁定和减少线程之间交互的可能性来实现线程安全。

这意味着无论线程如何运行,行为始终都是明确定义的(因此不受race conditions的限制。)

答案 1 :(得分:12)

Eric Lippert says

  

当我被问到“此代码线程是否安全?”我总是要回过头来问“你关注的确切线程场景是什么?”和“在每个场景中对象的正确行为是什么?” EM>”。

     

如果代码是“线程安全”而没有以某种方式传达所使用的线程安全机制所做的和不会阻止的不良行为,那就没有用了。

答案 2 :(得分:3)

天儿真好,

开始的好地方是阅读POSIX paper on thread safety

编辑:只需前几段就可以快速了解线程安全和重入代码。

HTH

欢呼声,

答案 3 :(得分:3)

我可能错了,但线程安全的标准之一是仅使用局部变量。如果从不同的线程调用相同的函数,则使用全局变量可能会有未定义的结果。

答案 4 :(得分:2)

线程安全函数/对象(以下称为对象)是一个旨在支持多个并发调用的对象。这可以通过并行请求的序列化或对交织调用的某种支持来实现。

基本上,如果对象安全地支持并发请求(来自多个线程),则它是线程安全的。如果它不是线程安全的,多个并发调用可能会破坏其状态。

考虑酒店的日志。如果一个人正在书中写作并且另一个人出现并开始同时写下他的消息,那么最终结果将是两个消息的混合。这也可以通过写入输出流的几个线程来证明。

答案 5 :(得分:1)

我会说要理解线程安全,首先要了解线程安全函数和重入函数之间的区别。

请查看The difference between thread-safety and re-entrancy了解详情。

答案 6 :(得分:0)

防伪代码是不会失败的代码,因为同时在两个地方更改了相同的数据。线程安全是比并发安全更小的概念,因为它假定它实际上是同一程序的两个线程,而不是(比如)硬件修改数据或操作系统。

答案 7 :(得分:0)

该术语的一个特别有价值的方面是它存在于一系列并发行为中,其中线程安全是最强的,中断安全是比线程安全更弱的约束,并且可重入甚至更弱。

在线程安全的情况下,这意味着所讨论的代码符合一致的api并利用资源,使得不同线程中的其他代码(例如另一个自身的并发实例)不会导致不一致,只要它也符合相同的使用模式。必须指定使用模式,以便对螺纹安全有任何合理的期望。

中断安全约束通常不会出现在现代用户态代码中,因为操作系统可以很好地隐藏它,但是,在内核模式下,这非常重要。这意味着即使在执行期间触发了中断,代码也会成功完成。

最后一个,可重入,几乎可以保证所有现代语言都在用户区内外,这只是意味着可以多次输入一段代码,即使代码中的执行尚未执行旧案件中的部分。例如,在递归函数调用的情况下会发生这种情况。通过访问非重入代码中的共享全局状态变量,很容易违反提供重入的语言。