阅读:1962回复:6
请教,如何在PASSIVE LEVEL保证某一组操作的原子性?
我现在需要在一个进程中,unmap掉一个虚拟地址,然后马上map到另外一个地方,在执行的时候,很可能另外一个线程会插进来,导致我刚刚unmap掉的地址还没有被我map前就被另外一个线程抢掉了。那么如何保证我在做这两个动作时候能够不被其他线程打断?
我试过 1。把 IRQL提高到DPC Level,但是unmaplockedpage不能在DPC LEVEL上调用。 2。我把thread优先级提高到最高,似乎还是不行。 3。曾经想过屏蔽中断,但那个会影响操作系统行为,有点危险 有没有更好的办法? |
|
沙发#
发布于:2008-08-25 12:18
用内核同步对象,如mutex。
访问资源前等这个mutex,访问完释放掉,就可以保证同步了。 |
|
板凳#
发布于:2008-08-25 14:51
是的,可以通过event,mutex来保护临界区
|
|
|
地板#
发布于:2008-08-25 16:00
问题是我不能控制其他线程的行为,因为我是处在某个进程空间里面的驱动程序,无法保证App在占用某个资源的时候,会合驱动进行同步。这个才是问题所在
引用第1楼flyingkisser于2008-08-25 12:18发表的 : |
|
地下室#
发布于:2008-09-01 12:50
内核可以使用自旋锁,保证多线程,多处理器安全
|
|
|
5楼#
发布于:2008-09-13 13:52
引用第4楼znsoft于2008-09-01 12:50发表的 : |
|
|
6楼#
发布于:2008-09-14 14:02
引用第4楼znsoft于2008-09-01 12:50发表的 : 大牛能不能说详细一点?我们也遇到了同样的问题,而且貌似没有很好的解决方法: 我的理解是就算进程A使用了自旋锁,在它获得自旋锁并使用某资源的时候,另一个不使用这个自旋锁的进程B(高于DPC level的驱动例程)一样有可能不受限制的去和进程A竞争某一个硬件资源。 |
|