Vik*_*ram 35 c java multithreading thread-safety
我遇到过这一行"有些功能本质上是线程安全的,例如memcpy()
"
维基百科将"线程安全"定义为:
如果一段代码仅以保证多个线程同时安全执行的方式操作共享数据结构,则它是线程安全的.
好.但本质上意味着什么呢?它与继承有关吗?
pet*_*rov 64
它与继承无关.它是一种非正式的表达方式,更像是
"某些功能本质上是线程安全的".例如,不
接触任何共享值/状态的函数无论如何都是线程安全的,即"本质上是线程安全的".
unw*_*ind 16
在这种情况下,我将其解释为"没有设计实现它,它仍然是线程安全的".
与继承概念没有直接联系,尽管这些词语是相关的.当然,这不是面向对象编程意义上的继承的示例.这只是一个功能,从其核心性质获得线程安全的属性.
当然memcpy()
,固有的线程安全也没有什么神奇之处.任何没有内部状态或"共享"副作用的函数都是如此,这就是为什么函数式编程,其中所有函数都应该是"纯粹的"并且缺乏副作用,这使得并行编程非常适合.
在实践中,典型的计算机很难在没有副作用的情况下完成"实际工作",特别是I/O的副作用非常明确.因此即使是纯函数式语言也经常会有一些非功能性的角落.
更新:当然,memcpy()
不是没有副作用,它的核心目的是操纵内存,如果在线程之间共享,肯定是不安全的.假设必须是,只要目标区域不同,一个或多个线程是否memcpy()
并行运行并不重要.
将其与例如对比printf()
,其在单个(用于过程)输出流上生成字符.必须明确地实现(根据POSIX的要求)是线程安全的,而memcpy()
不是.
本质上线程安全的功能是安全的,无需对线程进行任何特定的设计决策,它只是凭借其执行的任务而不是重新设计以强制线程安全而是线程安全的.说我写的非常简单的功能:
int cube(int x)
{
return x*x*x;
}
Run Code Online (Sandbox Code Playgroud)
它本质上是线程安全的,因为它无法读取或写入共享内存.但是,我也可以创建一个非线程安全的函数,但通过特定的设计和同步使其线程安全.说我之前有类似的功能:
void cubeshare()
{
static int x;
x = x * x * x;
printf("%l", x);
}
Run Code Online (Sandbox Code Playgroud)
这不是线程安全的,它完全有可能在每次使用之间都有x值的变化(实际上这实际上不太可能,因为x会被缓存,但我们可以说我们没有进行任何优化).
然而,我们可以像这样使这个线程安全(这是伪代码,真正的互斥体更复杂):
void cubesharesafe(mutex foo)
{
static int x;
lockmutex(foo);
x = x * x * x;
printf("%l", x);
unlockmutex(foo);
}
Run Code Online (Sandbox Code Playgroud)
然而,这本身并不是线程安全的,我们强迫它通过重新设计.真实的例子通常会比这复杂得多,但我希望这能给出一个最简单的可能水平的想法.如果您有任何疑问,请发表评论.