我遇到过这一行“某些函数本质上是线程安全的,例如memcpy()
”
Wikipedia将“线程安全”定义为:
如果一段代码仅以保证多个线程同时安全执行的方式操作共享数据结构,则它是线程安全的。
行。但本身意味着什么?它与继承有关吗?
答案 0 :(得分:63)
与继承无关。这是一种非正式的表达方式,更像是一种意思 “有些功能本质上是线程安全的”。例如,不具有的功能 触摸任何共享值/状态都是线程安全的,即“本质上是线程安全的”。
答案 1 :(得分:16)
在这种情况下,我将其理解为"如果没有设计实现它,它仍然是线程安全的"。
与继承概念没有直接联系,尽管这些词语是相关的。当然,这不是面向对象编程意义上的继承的示例。这只是一个函数,从核心性质来看,它具有线程安全的特性。
当然,memcpy()
本身就是线程安全的,也没有什么神奇之处。任何没有内部状态或"共享"副作用将是如此,这就是为什么functional programming,所有函数应该是"纯粹"并且没有副作用,非常适合并行编程。
在实践中,在典型的计算机上很难获得"真正的工作"没有副作用,特别是I / O的副作用非常明确。因此,即使是纯函数式语言也经常会有一些非功能性的角落。
更新:当然,memcpy()
并非没有副作用,它的核心目的是操纵内存,如果在线程之间共享,肯定不是&#39安全。必须假设只要目标区域不同,一个或多个线程并行运行memcpy()
并不重要。
将此与例如对比printf()
,它在单个(用于进程)输出流上生成字符。它必须明确地实现(根据POSIX的要求)是线程安全的,而memcpy()
则不是。
答案 2 :(得分:9)
本质上是线程安全的功能,无需对线程进行任何特定的设计决策就是安全的,它只是凭借其执行的任务而不是重新设计以强制线程安全而是线程安全的。假设我写了一个非常简单的函数:
int cube(int x)
{
return x*x*x;
}
它本身就是线程安全的,因为它无法读取或写入共享内存。但是我也可以创建一个非线程安全的函数,但通过特定的设计和同步使其线程安全。假设我之前有类似的功能:
void cubeshare()
{
static int x;
x = x * x * x;
printf("%l", x);
}
这不是线程安全的,它完全有可能在每次使用之间都有x值的变化(实际上这实际上不太可能,因为x会被缓存,但我们可以说我们没有做任何优化)。 p>
然而,我们可以使这个线程像这样安全(这是伪代码,真正的互斥体更复杂):
void cubesharesafe(mutex foo)
{
static int x;
lockmutex(foo);
x = x * x * x;
printf("%l", x);
unlockmutex(foo);
}
然而,这本身并不是线程安全的,我们强迫它通过重新设计。真实的例子通常会比这复杂得多,但我希望这能给出一个最简单的可能水平的想法。如果您有任何疑问,请发表评论。
答案 3 :(得分:4)
在memcpy
的情况下,只有一个线程能够提供从特定源到特定目标的写入。:初始设计的线程安全。
固有意味着:无需调整"实现目标的基本功能,在这种情况下:线程安全。
如果多个线程可能会干扰同一个"频道"与此同时,您最终会遇到与共享数据库相关的线程安全问题。
答案 4 :(得分:1)
固有意味着作为永久物存在。 它与继承无关.. 默认情况下,或者已经有一些方法是线程安全的...以保护或避免多任务问题.. 向量,哈希表 ..是一些本质上是线程安全的示例类。 没有...混淆..有一些函数......默认情况下是线程安全的..