来自创建的线程问题

时间:2017-02-23 10:13:56

标签: c erlang erlang-nif erlang-driver

我试图从创建的线程调用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 pid\n");
else
printf(" it's not pid\n");

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 succeed\n");
else
printf(" send failed\n");

在此阶段之前,我可以向我的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 pid\n");
else
printf(" it's not pid\n");
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 succeed\n");
else
printf(" send failed\n");

但是当我用enif_is_pid检查pid时,我得到了一个无效的pid,即使它在生成线程的函数中检查了相同的pid,因此发送失败。 好吗?

0 个答案:

没有答案