“固有线程安全”是什么意思?
我碰到这一行“一些函数本质上是线程安全的,例如memcpy()
”
维基百科将“线程安全”定义为:
如果一段代码只能以保证multithreading同时安全执行的方式来操作共享数据结构,那么它是线程安全的。
好。 但是, 固有的含义是什么? 它与inheritance有关吗?
这与inheritance无关 。 这是一个非正式的expression,意味着更多
“有些function是线性安全的”。 例如,一个没有的function
触摸任何共享的值/状态是线程安全的,即“本质上是线程安全的” 。
在这种情况下,我把它解释为“没有devise实现它,它仍然是线程安全的”。
与inheritance的概念没有直接的联系,尽pipe这些话当然是相关的。 当然,这不是面向对象编程意义上的inheritance例子。 这只是一个function,从它的核心本质中获得了线程安全的属性。
当然memcpy()
本身也是线程安全的。 没有内部状态或“共享”副作用的任何函数都是如此,这就是为什么函数式编程 ( 所有函数被认为是“纯粹”的并且没有副作用)对于并行编程来说非常适合。
实际上,典型的计算机很难在没有副作用的情况下完成“真正的工作”,特别是I / O的副作用。 所以即使是纯粹的function语言也经常有一些不起作用的angular落。
更新 :当然, memcpy()
不是没有任何副作用,它的核心目的是操纵内存,如果在线程之间共享,肯定是不安全的。 假设必须是只要目的地区域不同,如果一个或多个线程并行运行memcpy()
,则无关紧要。
将其与例如printf()
对比, printf()
在单个(用于进程)输出stream上生成字符。 它必须被明确地实现(按照POSIX的要求)是线程安全的,而memcpy()
不能。
一个固有的线程安全function是安全的,不需要针对线程进行任何特定的devise决定,只是凭借其执行的任务而不是重新devise来强制线程安全,而是线程安全的。 说我写了非常简单的function:
int cube(int x) { return x*x*x; }
它本质上是线程安全的,因为它无法读取或写入共享内存。 但是我也可以做一个不是线程安全的函数,而是通过特定的devise和同步来使线程安全。 说我以前有这个类似的function:
void cubeshare() { static int x; x = x * x * x; printf("%l", x); }
这不是线程安全的,它完全有可能在每次使用之间具有x变化的值(当然,实际上这不太可能,因为x会被caching,但可以说我们没有做任何优化)。
然而,我们可以使这个线程安全(这是伪代码,真正的互斥体更复杂):
void cubesharesafe(mutex foo) { static int x; lockmutex(foo); x = x * x * x; printf("%l", x); unlockmutex(foo); }
然而,这不是天生的线程安全,我们迫使它通过重新devise。 真实的例子往往比这个复杂得多,但是我希望这可以让我们把想法带到最简单的层面。 如果您有任何问题,请在下面留言。
在memcpy
情况下,只有一个线程能够提供从特定源到特定目标的写入。 :通过初始devise来保证线程安全。
本质上意味着:在这种情况下,不需要“调整”基本function来实现目标:线程安全。
如果多个线程可能同时干扰同一个“通道”,则最终会出现与共享数据卡片相关的线程安全问题。
固有的手段存在于永久的事物中。 它与inheritance没有任何关系..默认情况下,或者已经有一些方法是线程安全的…为了保护或避免多任务处理问题.. vector,哈希表 ..是一些本质上是线程安全的示例类。 。什么都没有.. confusing ..有一些function,这是默认线程安全..