0

以下是增加Filter函数并发的幼稚尝试:

fun {Filter L F}
      case L of
          X|Xs then if thread {F X} end
                    then X|{Filter Xs F}
                    else {Filter Xs F} end
          else nil
      end
end

什么是具有更好并发性的替代过滤器操作(代码)?(提示:您可以利用消息传递并发。)

4

1 回答 1

0

当前代码评估列表中的一个项目,然后是下一个项目,依次直到列表末尾。向代码添加并发性的一种方法是将逻辑分为两部分:评估和附加到结果列表。


评估:遍历列表并在单独的线程中评估每个项目,并将结果存储在布尔列表中。

Append:循环遍历布尔列表(在创建时同时),如果值为真,则添加到结果列表中。跳过所有错误值。


示例解决方案:

fun {FilterConc L F}
   ResultBool
   fun {Evaluate L F}
      case L of X|Xs then
      thread {F X} end|{Evaluate Xs F}
      else nil end
   end

   fun {AppendLoop L1 ResultBool1}
      case ResultBool1 of R|Rs then
      case L1 of X|Xs then
         case R of true then
            X|{AppendLoop Xs Rs}
         else {AppendLoop Xs Rs} end
      else nil end
      else nil end
   end
in
   ResultBool = {Evaluate L F}
   %{Browse ResultBool}       ---> shows [true false false false true true true]
   {AppendLoop L ResultBool}
end

{Show {FilterConc [1 2 4 6 121 52381 1235] Int.isOdd}}
% ---> shows [1 121 52381 1235]
于 2022-01-19T12:47:53.950 回答