说未来实现隐式同步是什么意思?

时间:2017-10-20 18:04:41

标签: c# multithreading synchronization programming-languages future

来自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返回   intnumberInStock类型为Task<int>

本书列出了隐式同步部分的未来,它同时包含for循环和未来的独立迭代。

  1. “隐式同步”是否意味着不需要同步?

  2. 说未来(例如C#的任务)实现隐式同步是什么意思?

  3. 在C#中,执行任务并启动它的主程序 不需要彼此同步?

    未来只有在计算未来时才会使用 创造未来的主程序不需要同步 彼此之间?

  4. 感谢。

1 个答案:

答案 0 :(得分:0)

此上下文中的同步意味着(引自wikipedia):

  

流程同步是指多个流程的想法   加入或握手某一点,以达到一个   同意或承诺某一行动序列

Task(作为&#34; future&#34;概念的一个例子)提供了一种方法来启动并发进程并在将来通过访问Result属性获取其结果(它不会< em>总是启动并发进程,但这并不重要)。因此,通过调用Result,您可以实现当前执行线程与Task表示的并发执行线程之间的同步(因为您的线程可能等待任务完成)。它是隐含的,因为您只是访问不使用特殊同步结构的常规属性。将其与ManualResetEvent的信号进行比较 - 您实现了相同的目标,但这一次是明确的。