行业动态 当前位置:首页 > 新闻资讯 > 行业动态 >

深圳电路板抄板让我痛苦的多线程并发安全问题

 

    一般来说,多线程的安全性是有多种级别的,所以每个人谈论的线程安全级别其实并不相同。对于多线程并发的安全问题,有些人概念不清需求不明,结果是在代码中处处加锁,影响性能不说还特别容易莫名其妙的死锁,而另外有一些人则是对多线程并发敬而远之,结果是使系统的处理效率大大减弱。所以,在进行WinCE多线程编程时最重要的不是片面的应用多线程并发,而是要理解怎样才能保证多线程并发的安全性。本文分享我在WinCE开发中对多线程并发的同步安全问题的一些教训和经验总结。
    1.让我痛苦的多线程并发安全问题
    (1)线程资源被占用与并发假死
    WinCE系统支持多线程,这无疑是一件很好的事情。因为这能给系统带来更好的并发性能,但这同时也带来了另一个比较棘手的开发问题,那就是如何让多线程的资源应用是安全的,这在WinCE多线程并发编程中是非常重要的。例如,这次的开发项目中就让我饱受反复调试之苦。原因是经常出现多个线程对同一个资源进行并发操作,结果是出现资源被占用的状态报错,或者是系统出现并发假死使到效率低下而变慢。
    一般来说,多线程的并发安全性是指一个线程在被调用过程中,还未返回时又再次被其它线程调用,在这种情况下执行结果的可靠性。如果结果是可靠的,则称这个多线程并发安全的;如果结果是不可靠的,则称这个多线程并发是不安全的。不安全的原因是发生了线程资源被占用或并发冲突。因此,多线程并发安全性如果处理不当,轻则导致程序运行时出错或假死,严重的话将导致WinCE系统崩溃。
    (2)最常见的并发线程安全问题:死锁
    由于在调试过程中多次出现资源被占用的情况,pcb抄板而且跟踪资源是否被占用的过程是非常费心费力的。因此,在开发过程中我大量通过锁定一个资源来防止任何其它线程访问这个资源,以避免资源竞争。但没有想到的是,这又导致了多线程资源争夺的另一个常见问题:死锁。为了避免并发死锁,我只好逐一分析资源占用和死锁的过程,这个分析过程不但让我备受折磨和感到痛苦不堪,而且开发项目也一度陷入进退两难的困境之中。
    所谓并发死锁(DeadLock)是指在WinCE编程中两个或两个以上的并发线程在执行过程中,如果每个线程持有某种资源而又都在等待别的线程释放它们现在保持着的资源,因占用资源而造成的一种互相等待的现象。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程就称为死锁线程。
    2. 多线程并发为什么会有安全性问题?
    (1)什么是多线程并发?
    在谈到多线程安全的时候,我们首先必须了解什么是多线程。WinCE是一个抢占多任务的操作系统,抢占多任务又称为调度,多线程是多任务的特殊形式。多线程是指允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。多线程的目的是为了使多个线程并行工作以完成多项任务,以此来提高系统的效率。
    从并发性的角度来看,不仅可以在不同的进程之间并发执行,而且在同一个进程中的多个线程也是可以并发执行的。一般来说,除了一些必不可少的资源外,线程本身并不占有系统的资源。但是线程却可以和同属于一个进程的另一个线程共享进程所拥有的全部资源,而且一个线程还可以创建或者撤销另一个线程,因此当处理不当时就会发生资源冲突问题了。