重视多线程的堆栈问题

  最近用scock+ssl去实现post请求之类的,功能倒是实现了,就是是不是来一个不知名的崩溃,有人说WSACleanup问题,对这个我表示怀疑,因为我之前写过http请求的,只要WSAStartup和它配对出现是没什么问题的。不过还是改成一个进程里面只有一组这样的冤家。不过问题依旧存在。。。

   后来有人说SSL_Free和SSL_shutdown不能一块玩耍,于是我将它们分开,但是还是没解决问题。于是我特意跑去看了SSL_Free和SSL_shutdown的源码实现,发现不是这么一回事,其中提到SSL_shutdown不能一次性完成,可能需要多次调用。

int SSL_shutdown(SSL *s)
{
    /*
     * Note that this function behaves differently from what one might
     * expect.  Return values are 0 for no success (yet), 1 for success; but
     * calling it once is usually not enough, even if blocking I/O is used
     * (see ssl3_shutdown).
     */

    if (s->handshake_func == 0) {
        SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED);
        return -1;
    }

    if (!SSL_in_init(s)) {
        return s->method->ssl_shutdown(s);
    } else {
        SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_SHUTDOWN_WHILE_IN_INIT);
        return -1;
    }
}

看起来很明显了吧。它们是没冲突的,不过调用的时候需要注意一下而已。于是改了这段之后,还是动不动崩溃,我也差点崩溃了。

  最后还好我脑瓜转过来了,那么无聊的随机崩溃,这不很明显就是堆栈内存问题吗?于是转到怀疑pthead的多线程实现上,我将那些alloc大内存的都搬出去了,然后运行果然正常。。。

  所以总结一下ptread的堆栈使用:

  如果非要大内存大手脚的使用,可以使用pthread_attr_setstacksize,否则就要将大内存的alloc都搬出线程,在pthread、_create之前就创建好。

pthread_attr_getstacksize是读取线程的堆栈的,可以自己衡量一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值