最近用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是读取线程的堆栈的,可以自己衡量一下。