CnPack Forum » 技术板块灌水区 » 在delphi中使用go语言的并发编程方法,增加demo2


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]

2010-12-1 13:56 zzzl
说没有cpu消耗不太严谨,其实意思是说在下面的一行会进入等待状态

页: [1]


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.