Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Multithreading 如何定义线程安全?_Multithreading_Definition - Fatal编程技术网

Multithreading 如何定义线程安全?

Multithreading 如何定义线程安全?,multithreading,definition,Multithreading,Definition,Threadsafe是文档中经常出现的一个术语,但是很少有人解释它的含义,尤其是在第一次学习线程的人可以理解的语言中 那么,您如何向线程新手解释Threadsafe代码呢? 我现在的想法是: 您是否使用了代码的构成要素列表 线程安全与线程不安全 书籍定义 一个有用的比喻 G'day 一个好的开始是阅读这本书 编辑:仅前几段就可以快速概述线程安全和可重入代码 嗯 干杯,线程安全函数/对象(以下称为对象)是一个设计用于支持多个并发调用的对象。这可以通过并行请求的序列化或对交织调用的某种支持来实现

Threadsafe
是文档中经常出现的一个术语,但是很少有人解释它的含义,尤其是在第一次学习线程的人可以理解的语言中

那么,您如何向线程新手解释
Threadsafe
代码呢? 我现在的想法是:

  • 您是否使用了代码的构成要素列表 线程安全与线程不安全
  • 书籍定义
  • 一个有用的比喻
G'day

一个好的开始是阅读这本书

编辑:仅前几段就可以快速概述线程安全和可重入代码


干杯,

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

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


考虑一下旅馆里的日志。如果一个人正在写这本书,而另一个人出现并开始同时写他的信息,最终结果将是两种信息的混合。这也可以通过几个线程写入输出流来证明。

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

当我被问到“这段代码是线程安全的吗?”时,我总是要回过头来问“您所关心的具体线程场景是什么?”以及“在这些场景中,对象的正确行为是什么?”

如果说代码是“线程安全的”,而不以某种方式传达所使用的线程安全机制所能阻止和不能阻止的不良行为,那是毫无帮助的


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

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

中断安全约束通常不会出现在现代用户代码中,因为操作系统很好地隐藏了这一点,然而,在内核模式下,这一点非常重要。这意味着代码将成功完成,即使在执行过程中触发了中断


最后一个是reentrant,几乎所有现代语言都可以保证,无论是在userland还是在userland之外,它只是意味着一段代码可能会被输入多次,即使在旧的情况下,代码段的执行还没有开始。例如,这可能发生在递归函数调用的情况下。通过访问非可重入代码中的共享全局状态变量,很容易违反语言提供的可重入性。

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

考虑到这一点,这对线程安全性的定义如下:

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


这意味着无论线程是如何运行的,行为总是定义良好的(因此不受限制)。

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

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


请查看详细信息。

仅部分正确,因为您只需使用互斥体保护这些全局变量,例如,为了线程安全function@claferri当前位置我想问这个问题的目的是了解哪些因素会导致线程不安全。您当然可以使用同步对象(不仅仅是互斥对象,还有信号量/关键部分等)来确保线程安全。我想指出导致线程不安全代码的原因之一。否决票是不必要的。涉及到两个独立的问题——第一个问题是,在第一个操作的执行过程中,嵌套的操作实例是否不能在任何点启动,或者它是否可能发生在特定的允许点,或者基本上是任意点;第二个问题是嵌套操作是否必须在原始操作恢复之前完成。由于多任务是如此流行,大多数可以启动嵌套操作的例程都允许它与第一个并发运行,但嵌套操作在进入时保存第一个操作的上下文,并在退出时还原它,这在过去是很常见的(在某些嵌入式上下文中仍然是)。在使用全局状态的场景中,使用此模式可能比使用多个活动状态以及在它们之间切换的能力容易得多。但是,它确实对一个人可以执行的多任务类型施加了一些限制。