如何定义线程安全?

问题描述 投票:11回答:8

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

那么您如何向线程新手解释Threadsafe代码?我目前的选择思路是:

  • 您是否使用代码清单线程安全与线程不安全
  • 书的定义
  • 一个有用的比喻
multithreading definition
8个回答
13
投票

Eric Lippert says

当我被问到“ 此代码线程安全吗?”时我总是不得不退后一步,问“ 您关心的确切线程方案是什么?”和“ 在每种情况下对象的正确行为到底是什么?”。

如果说代码是“ 线程安全”而没有以某种方式传达所利用的线程安全机制会做什么或不会阻止哪些不良行为,这是无益的。


14
投票

[多线程导致不确定的执行-您不知道何时运行特定的并行代码。

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

[线程安全代码是面对任何多线程情况都不会不确定的代码。线程安全主要是通过锁定并减少线程之间交互的可能性来实现的。

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


3
投票

G'day,

一个好的开始是阅读POSIX paper on thread safety

编辑:仅通过前几段,您可以快速概述线程安全性和可重入代码。

HTH

欢呼声,


3
投票

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


2
投票

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

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

考虑酒店的日志。如果一个人在写书,而另一个人走过来并开始同时写他的信息,则最终结果将是两种信息的混合。这也可以通过多个线程写入输出流来证明。


2
投票

我想说要了解线程安全,首先要了解线程安全功能和可重入功能之间的区别。

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


0
投票

踏行安全代码是不会失败的代码,因为同一数据一次在两个位置更改过。线程安全是一个比并发安全小的概念,因为它假定实际上是同一程序的两个线程,而不是(例如)硬件修改数据或操作系统。


0
投票

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

[在线程安全的情况下,这意味着所讨论的代码符合一致的api,并利用了资源,以使不同线程中的其他代码(例如其自身的另一个并发实例)不会引起不一致,只要它也符合相同的使用方式。为了合理地预期线程安全,必须指定使用模式。

中断安全约束通常不会出现在现代用户区代码中,因为操作系统在隐藏此约束方面做得很好,但是,在内核模式下,这非常重要。这意味着即使在执行过程中触发了中断,代码也将成功完成。

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

© www.soinside.com 2019 - 2024. All rights reserved.