是否可以在主线程之外使用/创建/修改SV / HV / AV?

时间:2014-09-18 13:14:20

标签: multithreading perl segmentation-fault xs

我正在尝试使用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

那么,有可能做我想做的事吗?

1 个答案:

答案 0 :(得分:2)

它崩溃的事实是一个非常好的迹象,你不能:)

在实际上有Perl解释器的线程中创建SV,即当您获取已解析的名称时。