C-创建线程问题的enif_send函数



我尝试从创建的线程调用enif_send。主要是,我有一个Erlang过程,它会听我从NIF发出的收到的消息。

首先,在我的enif函数中,我得到了我的erlang过程的pid,然后施放它,然后致电enif_send发送消息如下:

ErlNifPid* pid = (ErlNifPid*) enif_alloc(sizeof(ErlNifPid));
ErlNifPid * erlang_pid = (ErlNifPid*)argv;
ERL_NIF_TERM pid1 = enif_make_pid(env , erlang_pid);
if(enif_is_pid(env,pid1))
printf(" it's pidn");
else
printf(" it's not pidn");
msg_env = enif_alloc_env();
ERL_NIF_TERM replay = (ERL_NIF_TERM) *text;
msg = enif_make_tuple(msg_env, replay);
if(enif_send(NULL, erlang_pid, msg_env,msg))
printf("  send succeedn");
else
printf(" send failedn");

直到这个阶段,我能够向我的Erlang过程发送消息。

之后,我产生了一个enif_thread,然后将其传递给Env和PID作为参数,我尝试从线程调用enif_send,例如:

ERL_NIF_TERM pid1 = enif_make_pid(conn->env , conn->pid);
if(enif_is_pid(conn->env,pid1))
printf("it's pidn");
else
printf(" it's not pidn");
for (int i=0;i<index;i++)
{
msg_env = enif_alloc_env();
msg = enif_make_int(msg_env, 1); 
 if(enif_send(conn->env, conn->pid, msg_env,msg))
printf("  send succeedn");
else
printf(" send failedn");

但是,当我使用enif_is_pid检查PID时,我也有一个无效的PID,即使是在产生线程的功能中检查的pid,因此发送失败。有什么想法吗?

作为enif_send状态的文档,当函数从创建的线程调用时,env参数应为NULL

顺便说一句,很难看不见所有代码,但是您显示的代码的这一部分可能是有问题的:

ErlNifPid * erlang_pid = (ErlNifPid*)argv;
ERL_NIF_TERM pid1 = enif_make_pid(env, erlang_pid);

如果要呼叫者的PID,则应使用enif_self函数,或者将PID传递给NIF作为参数,则应使用enif_get_local_pid提取它。例如,如果这是从erlang呼叫者传递的第一个参数:

ErlNifPid pid;
if (!enif_get_local_pid(env, argv[0], &pid))
    return enif_make_badarg(env);

您可以将其复制在创建的发送线程中。

相关内容

  • 没有找到相关文章

最新更新