小编Ole*_*g G的帖子

嵌套闭包和捕获的变量

我有这个带有嵌套闭包的例子,它演示了内存泄漏

use v5.10;
use strict;

package Awesome;

sub new {
    bless {steps => [], surprise => undef}, shift;
}

sub say {
    print "awesome: ", $_[1], "\n";
}

sub prepare {
    my ($self, @steps) = @_;

    for my $s (@steps) {
        push @{$self->{steps}}, sub {
            $self->say($s);

            if ($s eq 'pony') {
                $self->{surprise} = sub {
                    $s;
                }
            }
        };
    }
}

sub make {
    my $self = shift;

    while (my $step = shift @{$self->{steps}}) {
        $step->();
    }

    if ($self->{surprise}) { …
Run Code Online (Sandbox Code Playgroud)

perl closures memory-leaks circular-reference

4
推荐指数
1
解决办法
273
查看次数

gethostbyname() 进程即使在不同的线程中也能一致地解析吗?

我通过不同线程的 gethostbyname() 进行了 DNS 解析实验。我关闭了网络链接并运行了下面的程序。输出是这样的

gethostbyname 开始于 1411234734
gethostbyname 开始于 1411234734
gethostbyname 开始于 1411234734
gethostbyname 完成于 1411234774
gethostbyname 完成于 1411234814
gethostbyname 完成于 1411234854

gethostbyname() 同时开始,但在 40 秒超时后一一完成。

然后我尝试了 getaddrinfo()。看起来这个函数没有遇到这个问题

getaddrinfo 开始于 1411235759
getaddrinfo 开始于 1411235759
getaddrinfo 开始于 1411235759
getaddrinfo 完成于 1411235799
getaddrinfo 完成于 1411235799
getaddrinfo 完成于 1411235799

那么,为什么我得到这个结果,这种行为是否仅针对 Linux?

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <time.h>
#include <pthread.h>

void *resolve_ghbn(void *host) {
    printf("gethostbyname started at %d\n", time(NULL));
    struct hostent *rslv = gethostbyname((char*)host);
    printf("gethostbyname finished at %d\n", time(NULL)); …
Run Code Online (Sandbox Code Playgroud)

c linux multithreading gethostbyname

2
推荐指数
1
解决办法
1324
查看次数