昨天跑的Thread程序还是停住了, 原因是不能再创建新的线程了, 返回错误代码11, 表示达到了最大能创建的线程数了. 一开始很不明白, 因为就我这个程序, 应当只会有一个线程在去行, 不可能多个. 于是我检查了一下进程占用的内存, 居然高达132MB, 因此是系统资源到了最大限制了(POSIX对最多进程数的限制).
于是我想起了当初用fork/vfork时, 因为没有加入一行代码, 导致了进程结束后, 系统并没有自动回收占用的有关资源, 因此线程可能也遇到了同样的问题. 经过一翻网上搜索, 终于明白了其中的道理.
创建线程时可以指定很多的属性, 如可Join的线程或者是自动Detach的线程, 默认是可Join的. 在系统中有一个定长数组, 存放了历来创建线的线程的信息, 可Join的线程虽然运行结束了, 但是资源不会回收, 要等主进程来检查, 因此线程创建多了, 这个数据全都满了, 所以不能再创建线了. 在大部份程中, 主进程创建了几个子进程后, 就调用pthread_join方法来等所有的子线程结束, 这时就相当于主进程去检查这个数据, 并回收已经结束的线程的资源. 在我的程序里没有pthread_join调用, 因此出了这个问题.
今天我又改了代码, 在开始线程之前, 先将老的线程清掉(pthread_detach), 其实就是从这个数组中清除占位标志, 并回收分配给每个线程的堆栈空间, 原来运行几分钟后内存就涨到30M, 现在这样改了后就一直没有增长, 看来应当是可以解决问题了.
又看不懂了吧? 我自已也是希里糊涂的了.