由于几天,我学二郎,用伟大的书编程二郎乔·阿姆斯特朗。
我下面讲并行编程的章节,并在本章的最后,有解决一个小问题:
写一个函数开始(AnAtom,游戏)作为菌种(FUN)注册AnAtom。 确保你的程序中,当两个平行的过程同时评估开始/ 2的情况下正常工作。 在这种情况下,你必须保证这些过程中的一个成功,另一个失败。
我解决了这个问题的第一个部分,确保每个进程将与不同的原子催生。
关于第二部分,我坚持,因为,如果我理解正确的话,我无法找到一个方法来检查两个平行的过程同时评估功能start/2
。 起初,我想过一个计数器检查过程中产卵的数量,但我无法理解如何执行此检查。 我发现了一些有趣的事情在这里这个线程 (从OOP背景的人,我想到了Singleton模式),但我不知道是否读取和写入与计数器的文件是执行此检查的最佳途径。 我认为有一个简单的方法来做到这一点。
我写的代码如下:
-module(probl).
-export([start/2,stop/1]).
start(Atom,Fun) ->
% check here counter value
case isUniqueProcess(Times) of % here I'm trying to use a counter, but I'm stuck..
true ->
Pid = spawn(fun() -> doSomething(Atom,Fun) end),
register(Atom,Pid);
false ->
io:format("Sorry, no more processes to spawn."),
void
end.
stop(Atom) ->
case whereis(Atom) of
undefined -> void;
Pid -> io:format("Stopped."), Pid ! stop
end.
isUniqueProcess(Times) -> % here I should increment the counter, but how?
if
Times =:= 0 ->
true;
Times > 0 ->
false
end.
doSomething(Atom,Fun) ->
receive
stop -> void
after 15000 ->
Fun(),
doSomething(Atom,Fun)
end.
对我来说,从一个强大的面向对象的背景的,它不是那么容易切换另一种编程的心态,就像它发生在二郎,也许这是我困难的原因。 我怎么解决这个问题?