C# C语言中的调用返回语义

C# C语言中的调用返回语义,c#,multithreading,C#,Multithreading,我们知道,C的内置线程模型不支持将返回值从一个线程传递回创建它的父线程。我正在用C语言实现一个用于矩阵计算的小型编译器。编译器使用System.Reflection.Emit名称空间生成IL代码。对于这个编译器,我计划实现调用返回语义。有人能给我指出一种使用C线程或任何其他技术实现调用返回语义的合适技术吗?您是否考虑过使用.Net framework用于所有回调风格编程的IAsyncResult。基本上,在进行函数调用时,可以使用return-IAsyncResult。然后,可以使用AsyncW

我们知道,C的内置线程模型不支持将返回值从一个线程传递回创建它的父线程。我正在用C语言实现一个用于矩阵计算的小型编译器。编译器使用System.Reflection.Emit名称空间生成IL代码。对于这个编译器,我计划实现调用返回语义。有人能给我指出一种使用C线程或任何其他技术实现调用返回语义的合适技术吗?

您是否考虑过使用.Net framework用于所有回调风格编程的IAsyncResult。基本上,在进行函数调用时,可以使用return-IAsyncResult。然后,可以使用AsyncWaitHandle属性向调用者发回结果已就绪的信号,并将结果传递到AsyncState属性中


这是一种使用预定义类完成所需操作的干净方法。您可以实现某种信号,然后实现共享变量之类的东西来传回结果。如果您需要尝试使互锁代码尽可能高效地工作,这可能会对您有所帮助。

再详细一点可能会有用,但

为了将返回值返回到父线程,您需要一些rendez-vous机制。它可以是简单的父线程阻塞并等待完成,也可以是更复杂的异步模式BeginXxx EndXxx,比如BeginSend EndSend或continuations

在最简单的情况下,一个想法可能是将并发调用封装在一个类中,该类包含线程和一个用于返回值的字段,您可能希望使该类成为泛型的。 为了更复杂更高效!使用异步的实现,我真的建议研究一下TPL.NET4并行库。特别是,看看Task.ContinueWith:如果在编译器中您能够将调用返回转换为连续性的串联,那将是一个很好的实现


更多详细信息:假设您有以下序列:

Matrix a = blah; 
Matrix b = ConcurrentOperationOnMatrix(a); 
// this must block, wait for the prev line to complete
AnotherOperationOnMatrix(b); 
您可以将其转换为连续列表:

ConcurrentOperationOnMatrix(a, b => AnotherOperationOnMatrix(b)); 
每个函数都不会返回,它只是在完成时调用程序的其余部分。看看异步工作流,它们使用相同的技术。

看看:

任务类

表示可以返回值的异步操作

示例1:启动新任务并等待任务完成

示例2:启动新任务并在任务完成后继续执行操作


更多细节:假设您有以下序列:矩阵a=blah矩阵b=concurrentOperationonMatrix;另一项操作在矩阵B中;//这必须阻塞,等待上一行完成。您可以将其转换为一个连续列表:ConcurrentOperationOnMatrix,b=>AnotherOperationOnMatrix;每个函数都不会返回,它只是在完成时调用程序的其余部分。查看F异步工作流,它们使用相同的技术。编辑您的答案,而不是添加注释。这使代码更易于阅读。我想.Net中的一些新代码现在可能会使用c中的async,任何以Begin开头的方法。。。当你想在矩阵/arryas等上进行并行化时,也可以看看任务并行库中的“数据并行”一章
var task = Task<int>.Factory.StartNew(() => GenerateResult());

task.Wait();
Console.WriteLine(task.Result);
var task = Task<int>.Factory.StartNew(() => GenerateResult());

task.ContinueWith(t =>
{
    Console.WriteLine(t.Result);
});