pthread新手坑,跟着网上直接写,pthread_create然后就让函数跑,跑完了直接在函数里面return。这个流程,小测试,一点毛病都没有,跑得贼溜。
但是客户拿去压测七天后,出现卡死的现象。分析后,发现printf内容出来了,但是thread的httppost数据没有发到服务器,怀疑是线程问题。
开始查资料以为调用return返回有问题,还特意去查了pthread_exit,甚至问了少头发大佬。说是return是在线程创建函数直接返回,而pthread_exit是可以在任何子函数中直接线程返回到调用,那这就不是引起问题的原因。
再查,查到一个资源回收的问题。贫瘠的C语言啊,这样开线程,可以跑,但是用完不会回收,就那样僵死在那里,资源占用着。等线程表满了,再新建线程,就直接撂挑子返回11了。为此还特意写了demo测试。
管杀不管埋的操作,创建了32753个线程后,再创建,就直接返回11了。
然后在pthread_create后面增加了pthread_detach调用,测试就不一样了,线程数量级再多两个都没问题,然后可以手动停止测试了。
做事还是要做全套,调用流程要走全啊。
pthread_create-》pthread_detach(pthread_join)-》pthread_exit