多核基本意味着多线程,那么在多线程处理中有一个比较棘手的问题:当存在一些常驻的线程访问的共享数据时,退出时必须先结束这些常驻线程才能对共享资料进行释放操作。否则,先释放这些共享资源,后面的常驻线程访问这些已经释放了的共享数据时,导致程序异常。比如下面的情况: 1.单个子线程退出算法 这种情况是最简单地情况,因为只有一个线程,可以通过设置一个退出标志的方式来实现。具体地说就是再进行释放操作要进行的时候先设置一个退出一个标志,在子进程中要定期检测这个标志, 如果子进程检测到这个退出标志为真时就退出线程,在子进程具体退出过程中,也要让释放操作的线程知道操作链表的子进程已经退出,这个可以通过让子线程在退出的最后一步发送一个事件通知,释放线程就可以安全地进行释放操作了。具体的方案如下图:
2.多个线程退出算法 和1相比,麻烦在于此时有多于一个的子线程,如果每个子线程都在退出前发送一个事件通知给释放操作的线程,就可能出现第一个子线程退出就发送了事件通知,而此时还有其余的子线程还在进行对链表的访问操作,但释放操作的线程已经收到了事件通知,进行了释放。这时显然是会出现问题的。解决这个问题的关键就在于释放链表操作的线程在知道所有的子线程都退出的时候再进行释放的操作。
至于最后的源码实现,这里不给了,目前有两种方法:利用锁来完成和原子操作两种方式来完成。这里的加/解锁和原子操作只要是为了维持计数器的值,防止多线程同时对其修改的目的。 |
|