gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:45:39 25 4
gpt4 key购买 nike

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

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

最佳答案

它崩溃的事实是一个很好的迹象,表明你不能:)

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

关于multithreading - 是否可以在主线程之外使用/创建/修改 SV/HV/AV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25913689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com