来自Programming Language Pragmatics, by Scott
13.4.5隐式同步
在几种共享内存语言中,线程可以执行的操作 对共享数据执行的操作受到限制 同步可以隐含在操作本身中,而不是 而不是作为单独的,明确的操作出现。
我们已经看到了一个隐式同步的例子: HPF和Fortran 95的forall环(实施例13.10)。单独的迭代 一个forall循环同时进行,语义上与锁定步骤 彼此:每次迭代都会读取其实例中使用的所有数据 在任何迭代更新其实例之前的第一个赋值语句 左手边。左侧更新依次发生 任何迭代都会读取其第二个实例中使用的数据 赋值语句,等等。 forall循环的编译 矢量机虽然远非琐碎,但或多或少 直截了当。然而,在更传统的多处理器上,很好 性能通常取决于高质量的依赖性分析, 它允许编译器识别哪些语句的情况 在一个循环中实际上并不依赖于彼此,并且可以继续 没有同步。
期货
无需编译器分析也可以实现隐式同步。 ......
使用C#的任务并行库(TPL),我们可以编写
var description = Task.Factory.StartNew(() => GetDescription()); var numberInStock = Task.Factory.StartNew(() => GetInventory()); ... Console.WriteLine("We have " + numberInStock.Result + " copies of " + description.Result + " in stock");
静态库类
Task.Factory
用于生成未知,已知 作为C#中的“任务”。 Create方法支持泛型类型推断, 允许我们传递与Func<T>
兼容的委托(函数 对于任何T
,返回T
)。我们在这里指定了代表们 lambda表达式。如果GetDescription
返回String
, 描述将是Task<String>
类型;如果GetInventory
返回int
,numberInStock
类型为Task<int>
。
本书列出了隐式同步部分的未来,它同时包含for循环和未来的独立迭代。
“隐式同步”是否意味着不需要同步?
说未来(例如C#的任务)实现隐式同步是什么意思?
在C#中,执行任务并启动它的主程序 不需要彼此同步?
未来只有在计算未来时才会使用 创造未来的主程序不需要同步 彼此之间?
感谢。
答案 0 :(得分:0)
此上下文中的同步意味着(引自wikipedia):
流程同步是指多个流程的想法 加入或握手某一点,以达到一个 同意或承诺某一行动序列
Task
(作为&#34; future&#34;概念的一个例子)提供了一种方法来启动并发进程并在将来通过访问Result
属性获取其结果(它不会< em>总是启动并发进程,但这并不重要)。因此,通过调用Result
,您可以实现当前执行线程与Task
表示的并发执行线程之间的同步(因为您的线程可能等待任务完成)。它是隐含的,因为您只是访问不使用特殊同步结构的常规属性。将其与ManualResetEvent
的信号进行比较 - 您实现了相同的目标,但这一次是明确的。