我正在尝试使用pthread_create()创建的新线程中使用newSVpvn()创建SV。此时我的程序崩溃了。 崩溃发生的C函数看起来像这样
void *_inet_aton(void *v_arg) {
SV* rv = &PL_sv_undef;
struct thread_arg *arg = (struct thread_arg *)v_arg;
struct hostent *rslv = gethostbyname(arg->host);
if (!rslv) {
goto RET;
}
if (rslv->h_addrtype == AF_INET && rslv->h_length == 4) {
// !!!CRASH HERE!!!
rv = newSVpvn((char *)rslv->h_addr, rslv->h_length);
}
RET:
free(arg->host);
free(arg);
}
和XSUB
void
inet_aton(Net_DNS_Native *self, char *host)
CODE:
pthread_t tid;
struct thread_arg *t_arg = malloc(sizeof(struct thread_arg));
t_arg->self = self;
t_arg->host = strdup(host);
pthread_create(&tid, &self->thread_attrs, _inet_aton, (void *)t_arg);
测试示例
use blib;
use Net::DNS::Native;
my $dns = Net::DNS::Native->new();
$dns->inet_aton("google.com");
# wait for a thread
sleep 10;
可在此处找到完整代码:https://github.com/olegwtf/p5-Net-DNS-Native/blob/fbc57dbe9e6832afed8d46cd369db6930bbd53bc/Native.xs
那么,有可能做我想做的事吗?
答案 0 :(得分:2)
它崩溃的事实是一个非常好的迹象,你不能:)
在实际上有Perl解释器的线程中创建SV,即当您获取已解析的名称时。