能力值:
( LV4,RANK:50 )
|
-
-
2 楼
只能是一条指令?
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
InterlockedBitTestAndSet
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
进来学习下啊
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
InterlockedCompareExchange()
对应的汇编指令是lock cmpxchg r/m, r
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
用 InterlockedCompareExchange 就能满足楼主的线程同步要求。
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
如果只是简单的为假就置真可以用not,xor,or等指令吧?
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
同感,如果只是一条指令的话,用xor把数值与“假”值作异或运算应该就可以了吧。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
or dword prt [mem],1
|
能力值:
(RANK:50 )
|
-
-
10 楼
假设标志存储在bool Flag中
or Flag,1
or mem,imm可以加上lock前缀锁总线以保证实现“原子操作”
lock or Flag,1
不过我在Ring0的代码中有锁总线的行为时有时会导致BSOD,原因不明。
====================分割线=====================
另外还是推荐LZ利用Windows提供的各种机制实现同步。内联汇编会带来无数麻烦……
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
我求这指令是因为我想把判断资源是否被占用的操作原子化,只要把这些操作放到关中断和开中断中间就ok了,我想windows的函数也许是这样实现原子化的吧。这么简单的问题居然没想到。。。。。。。。。。。。。。。。。
|
能力值:
( LV6,RANK:90 )
|
-
-
12 楼
汇编单条指令并不代表是原子化的
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
话又不说完,怎么不原子化了?难不成一条汇编指令的执行过程会被中断?
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
请问所有种类的cpu中那种是关中断的指令在执行过程中都要被打断的?哪位天才发明的啊。
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
你关中断然后执行一段指令,不被打断,再开中断,那只是单核的同步问题。如果是多核处理器,只能用原子操作来同步。你说为何是原子操作,难道一条指令中间还会被打断吗?一条指令确实不会被中断,但是在多核情况下,对内存的操作可能就不同步了。举个简单例子。
inc 某个内存,而不是inc 寄存器。
这个inc ,先把内存读进来,再加1 ,再写入内存。是这3个步骤,中断是不可能的。单核不会出错,如果内存原来是1,执行以后就是2 。
现在看多核的情况,核1,读内存为1,加1,等于2,还没有写入内存,慢点,核2也开始读内存了,内存还是1,也加1,核2也准备写入内存了,不管核1还是核2先后写入,内存最后结果是2,而这就是2个核没有同步,我们都知道同步的结果应该是3 ,核1加1,核2再加1吗,等于3,很简单。
所以要用lock操作,锁住内存总线,核1读出内存为1,加1,再写入内存之前,lock总线,核2是不可能读内存的,只有等核1写入结果2,核2再读内存,读出2,加1,写入3到内存。这样就同步执行了,结果正确。
|
能力值:
( LV13,RANK:400 )
|
-
-
16 楼
多个核心,需加kock前缀锁总线,才安全。
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
如果只是为了实现自进程现成同步,你得到当前过程地址,然后动态调用不是就可以!
另外也可以建立一个消息钩子来实现!
汇编的话可以
在 Thread 1 {
xor Tr,0
}
Thread 2 {
cmp Tr,0
Jne @aa:
@aa:
}
楼上几位的方法也不错!
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
[QUOTE=小色;1145484]or dword prt [mem],1[/QUOTE]
小色大大正解,,我是QQ 952203029
|
|
|