多线程并发处理

问题:在两路或三路同时回放同一个文件夹下的BMP图像时,由于两个或三个线程同时访问相同的数据而引发冲突,使线程意外终止。
解决方法:利用MFC提供的同步类和同步访问类。
同步类:CSyncObject, CSemaphore, CMutex, CCriticalSection ,CEvent;
同步类用于当访问资源时保证资源的整体性。其中CsyncObject 是其它四个同步类的基类,不直接使用。信号同步类CSemaphore 通常用于当一个应用程序中同时有多个线程访问一个资源(例如,应用程序允许对同一个Document 有多个View)的情况;事件同步类CEvent 通常用于在应用程序访问资源之前应用程序必须等待(比如,在数据写进一个文件之前数据必须从通信端口得到)的情况;而对于互斥同步类CMutex 和临界区同步类CcriticalSection 都是用于保证一个资源一次只能有一个线程访问,二者的不同之处在于前者允许有多个应用程序使用该资源(例如,该资源在一个DLL 当中)而后者则不允许对同一个资源的访问超出进程的范畴,而且使用临界区的方式效率比较高。
同步访问类:CMultiLock和CSingleLock 。
同步访问类用于获得对这些控制资源的访问。CMultiLock 和CSingleLock 的区别仅在于是需要控制访问多个还是单个资源对象。
本问题可以使用互斥同步类CMutex 、信号量同步类CSemaphore和临界区同步类CcriticalSection 中的任意一个解决。
1、临界区
临界区是保证在某一个时间只有一个线程可以访问数据的方法。使用它的过程中,需要给各个线程提供一个共享的临界区对象,无论哪个线程占有临界区对象,都可以访问受到保护的数据,这时候其它的线程需要等待,直到该线程释放临界区对象为止,临界区被释放后,另外的线程可以强占这个临界区,以便访问共享的数据。当利用临界区同步时,同一时刻每次只有一个线程可以访问受到保护的数据,这样可以保证程序的稳定性。由于当一个线程访问受到保护的数据的时候,其他线程必须等待,所以同步时耗时也较多。
#include "afxmt.h"
CCriticalSection Section;//声明一个临界区同步类对象
当线程需要访问保护数据时,调用临界区对象的Lock()成员函数;当对保护数据的操作完成之后,调用临界区对象的Unlock()成员函数释放对临界区对象的拥有权,以使另一个线程可以夺取临界区对象并访问受保护的数据。
2.互斥
互斥跟临界区很相似,便远比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。通过互斥同步类CMutex来完成线程间的互斥,为了访问一个互斥对象,务必建立一个同步访问类CSingleLock或CMultiLock对象,用于访问控制。使用方法:
#include "afxmt.h"
CMutex m_mutex; //声明一个互斥同步类对象
在线程执行函数中声明同步访问类CSingleLock对象
CSingleLock slock(&m_mutex);
如果互斥没有被线程占用,那么当前的调用线程可以成为互斥的占用者。要实现对互斥的访问,就要调用CSingleLock的成员函数Lock(),如果一个线程占用了互斥,那么系统将挂起当前的调用线程,直到这个互斥被释放为止,这时,被挂起的线程将被唤醒并取得对互斥的控制。释放互斥是通过调用CSingleLock的成员函数UnLock()来实现的。
3.信号量
信号量的用法和互斥的用法很相似,不同的是它可以同一时刻允许多个线程访问同一个资源,创建一个信号量需要用Csemaphore类声明一个对象,一旦创建了一个信号量对象,就可以用它来对资源的访问技术。要实现计数处理,先创建一个CsingleLock或CmltiLock对象,然后用该对象的Lock()函数减少这个信号量的计数值,Unlock()反之。
本任务中采用临界区同步类。
Java多线程并发处理是指在一个程序中同时执行多个线程的能力。在Java中,可以通过使用Thread类或实现Runnable接口来创建和管理多个线程。 多线程并发处理的好处是可以提高程序的效率和响应速度。通过将任务划分为多个线程,并同时执行这些线程,可以利用计算机的多个处理单元或多核处理器的优势,充分发挥计算资源的能力。 在多线程处理中,需要注意线程之间的安全性和同步性。由于多个线程同时访问共享的资源可能引发竞态条件或死锁等问题,因此需要使用同步机制来保证资源的正确访问。Java提供了synchronized关键字和Lock接口等机制来实现线程的同步。 除了同步机制,Java还提供了线程间通信的方法,如wait()、notify()和notifyAll()等,用于实现线程间的协作和数据传输,避免了线程之间的竞争和冲突。 同时,在多线程并发处理中,还需要注意线程的调度和优先级设置。Java中的线程调度器会根据线程的优先级和调度策略来决定线程的执行顺序,以及如何平衡和分配计算资源。 总而言之,Java多线程并发处理是一种实现并行计算和提高程序性能的重要手段。通过合理的线程设计和管理,可以充分利用计算资源,提高程序的效率,并实现多个任务的同时执行。同时,也需要注意处理线程安全性和同步问题,以及线程的调度和优先级设置,保证多线程的正确和高效运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值