线程泄漏
线程执行任务时,若任务发生错误抛出异常,而未处理异常,线程被强制打断,无法正常执行,导致资源泄漏。
破坏性
对于线程池来说,线程泄漏意味着线程池可用线程永远减少,若这种情况发生次数足够多,最终线程池无可用线程,无法处理任务,当任务堆积过多,内存耗尽,最终导致程序崩溃。
解决方案
为防止任务抛出异常而导致线程泄漏,加入异常处理机制,在执行任务时捕获异常,保证工作线程正常运行,增强线程池的健壮性。
虚假激活(待重写)
对于多核处理器,当一个线程通过条件变量发送激活信号,激活单个或者多个阻塞于此条件变量的线程,然而对于被激活的线程来说,存在不满足执行条件的情况。这种效应称为虚假激活。
破坏性
激活不满足执行条件的线程,所产生的影响取决于程序健壮性,可能导致运算出错,也可能抛出异常而导致线程崩溃,甚至还可能导致其他线程出错。
解决方案
针对此问题提供两种方案,一种在激活之时检查执行条件,另一种在激活之后检查执行条件。
两种方案作用线程不同。第一种方案作用于发送激活信号的线程,若不满足条件,则不进行激活操作。第二种方案作用于阻塞的线程,若不满足条件,再次进入阻塞状态。
激活先于阻塞(待重写)
一线程通过条件变量发出激活信号可能先于另一线程等待条件变量。
破坏性
激活先于阻塞,其影响轻则线程因此错过一次执行时机,重则线程一直处于阻塞状态而无法执行。
情形
此线程负责执行任务,一次执行时因等待任务而阻塞,彼线程负责分配任务并激活线程。倘若激活先于阻塞,彼线程分配任务之后,此线程仍阻塞,占据任务却不执行任务,彼线程因此无法再次分配任务,即无法再次激活线程,于是此线程一直处于阻塞状态。
解决方案
在等待条件变量之前,检查是否满足执行条件,若满足条件就不必等待。