Невозможно использовать Erlang / ETS в блоке приема - PullRequest
4 голосов
/ 27 марта 2011

Я пытаюсь использовать Erlang / ets для хранения / обновления различной информации путем сопоставления с образцом полученных данных.Вот код

start() -> 
    S = ets:new(test,[]),
    register(proc,spawn(fun() -> receive_data(S) end)).

receive_data(S) ->
    receive
        {see,A} -> ets:insert(S,{cycle,A}) ;
        [[f,c],Fcd,Fca,_,_] -> ets:insert(S,{flag_c,Fcd,Fca});
        [[b],Bd,Ba,_,_] -> ets:insert(S,{ball,Bd,Ba})



    end,
    receive_data(S).

Здесь A - номер цикла, [f, c] - флаг центра, [b] - шар, а Fcd, Fca, Bd, Ba - направления и угол флага и шара отигрок.

Процесс отправителя отправляет эту информацию.Здесь сопоставление с образцом работает правильно , что я проверил, печатая значения A, Fcd, Fca..etc.Я считаю, что с использованием Erlang / ets что-то не так.

Когда я запускаю этот код, я получаю такую ​​ошибку

Error in process <0.48.0> with exit value: {badarg,[{ets,insert,[16400,{cycle,7}]},{single,receive_data,1}]

Может кто-нибудь сказать мне, что с этимкод и как исправить эту проблему?

1 Ответ

7 голосов
/ 27 марта 2011

Проблема в том, что владельцем таблицы ets является процесс, выполняющий функцию start/1, а поведение по умолчанию для ets - , позволяющее владельцу только писать, а другим процессам читать , иначезащищенный.Два решения:

  1. Создать таблицу ets как общедоступную

    S = ets:new(test,[public]). 
    
  2. Установить владельца для только что созданного процесса

    Pid = spawn(fun() -> receive_data(S) end, 
    ets:give_away(test, Pid, gift)
    register(proc,Pid)
    

Документация для give_away / 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...