2010-11-30 11:38
zzzl
在delphi中使用go语言的并发编程方法,增加demo2
上一篇([url=http://bbs.cnpack.org/viewthread.php?tid=9514&extra=page%3D1]http://bbs.cnpack.org/viewthread.php?tid=9514&extra=page%3D1[/url])只提供了一个示例,可能不太容易说明什么,这里再增加一个例子。
[color=#006400] {这个示例演示了经典的生产消费问题。 [/color]
[color=#006400] go的教程里就这个问题提供了一个Eratosthenes素数筛选法的例子,这里简化一下,演示筛选偶数吧}[/color]
[color=#006400][/color]
[font=Consolas][color=black]我习惯把begin写成同一行,可能很多人不习惯。而这个问题在go语言里消失了,因为它要求{不能换行。[/color][/font]
[color=#000080][b]program[/b][/color] [color=#000000]demo2[/color];
[i]{$APPTYPE CONSOLE}[/i]
[color=#000080][b]uses[/b][/color]
[color=#000000]SysUtils[/color][color=#000000],[/color]
[color=#000000]coroutineUnit[/color];
[color=darkgreen]//bug反馈:22140505@qq.com
[/color]
[color=#000080][b]begin[/b][/color]
[color=#000000]TProc[/color]([color=#000080][b]procedure[/b][/color]()
[color=#000080][b]var[/b][/color]
[color=#000000]i[/color][color=#000000]:[/color] [color=#000080][b]Integer[/b][/color];
[color=#000000]c[/color][color=#000000]:[/color] [color=#000000]CChannel[/color][color=#000000]<[/color][color=#000080][b]Integer[/b][/color][color=#000000]>;[/color] [color=#006400]//声明一个通道,它可以携带一个整数,用于在两个线程之间传递[/color]
[color=#000080][b]begin[/b][/color]
[color=#000000]c[/color][color=#000000]:=[/color][color=#000000]CChannel[/color][color=#000000]<[/color][color=#000080][b]Integer[/b][/color][color=#000000]>.[/color][color=#000000]Create[/color];
[color=#000000]go[/color]( [color=#006400]//启动生产线程[/color]
[color=#000080][b]procedure[/b][/color]()
[color=#000080][b]var[/b][/color]
[color=#000000]i[/color][color=#000000]:[/color] [color=#000080][b]Integer[/b][/color];
[color=#000080][b]begin[/b][/color]
[color=#000080][b]for[/b][/color] [color=#000000]i[/color][color=#000000]:=[/color][color=#0000ff]1[/color] [color=#000080][b]to[/b][/color] [color=#0000ff]10[/color] [color=#000080][b]do[/b][/color] [color=#006400]//制作10个整数作为产品(好弱。。),交给产生线程[/color]
[color=#000000]c[/color][color=#000000].[/color][color=#000000]value[/color][color=#000000]:=[/color][color=#000000]i[/color];
[color=#000000]c[/color][color=#000000].[/color][color=#000000]value[/color][color=#000000]:=-[/color][color=#0000ff]1[/color]; [color=#006400]//为-1时表示生产结束了(这属于这个模型的协议,我随意规定的)[/color]
[color=#000080][b]end[/b][/color]);
[color=#000000]go[/color]( [color=#006400]//启动消费线程,它不停的接收整数产品,判断并输出为偶数的值[/color]
[color=#000080][b]procedure[/b][/color]()
[color=#000080][b]var[/b][/color]
[color=#000000]i[/color][color=#000000]:[/color] [color=#000080][b]Integer[/b][/color];
[color=#000080][b]begin[/b][/color]
[color=#000080][b]while[/b][/color] [color=#000080][b]true[/b][/color] [color=#000080][b]do[/b][/color] [color=#000080][b]begin[/b][/color] [color=#006400]//不停的处理,但没有cpu消耗的[/color]
[color=#000000]i[/color][color=#000000]:=[/color][color=#000000]c[/color][color=#000000].[/color][color=#000000]value[/color]; [color=#006400]//接收产品,如果没收到,就停在这等[/color]
[color=#000080][b]if[/b][/color] [color=#000000]i[/color][color=#000000]=-[/color][color=#0000ff]1[/color] [color=#000080][b]then[/b][/color] [color=#000080][b]begin[/b][/color] [color=#006400]//为-1时表示生产结束了(这属于这个模型的协议,我随意规定的)[/color]
[color=#000000]c[/color][color=#000000].[/color][color=#000000]Free[/color];
[color=#000080][b]break[/b][/color];
[color=#000080][b]end[/b][/color];
[color=#000080][b]if[/b][/color] [color=#000000]i[/color] [color=#000080][b]mod[/b][/color] [color=#0000ff]2[/color][color=#000000]=[/color][color=#0000ff]0[/color] [color=#000080][b]then[/b][/color]
[color=#000000]writeln[/color]([color=#000000]inttostr[/color]([color=#000000]i[/color]));
[color=#000080][b]end[/b][/color];
[color=#000080][b]end[/b][/color]);
[color=#000080][b]end[/b][/color])();
[color=#000000]Readln[/color];
[color=#000080][b]end[/b][/color][color=#000000].[/color]