[Kos-dev] Non-Blocking Synchronization
Christophe Avoinne
kos-dev@enix.org
Mon, 25 Jun 2001 15:31:20 +0200
This is a multi-part message in MIME format.
------=_NextPart_000_0023_01C0FD8B.E1FEFD80
Content-Type: multipart/alternative;
boundary="----=_NextPart_001_0024_01C0FD8B.E1FEFD80"
------=_NextPart_001_0024_01C0FD8B.E1FEFD80
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Il y a des exemples de sources mais en allemand.
A noter qu'ils parlent de l'instruction "xchgcmp" pour illustre le CAS =
et prennent l'exemple suivant :
#define INCREASE(x) \
asm volatile(" \
0: mov %1,%%eax\n \
mov %%eax,%%ebx\n \
inc %%ebx\n \
cmpxchg %%ebx,%0\n \
jne 0b" \
: "=3Dm" ((x)) \
: "m" ((x)) \
: "eax", "ebx", "cc");
En r=E9alit=E9, leur exemple n'est pas tr=E8s bon dans la mesure o=F9 on =
peut faire simplement "lock; inc %0" =E0 la place. Par contre si on a =
besoin de conna=EEtre la valeur avant l'incr=E9mentation atomique, il =
faut utiliser =E0 la place "xadd" qui correspond =E0 la classe "fetch =
and modify" :
#define INCREASE(x) \
asm volatile("xadd %1,%2" : "=3Da" (result) : "a"(1), "m" ((x)) : "cc");
L=E0, deux processeurs ne peuvent pas lire en m=EAme temps la m=EAme =
valeur dans leur registre "eax".
http://www.first.gmd.de/~fs/peace-pro97/non_blocking_sync/
------=_NextPart_001_0024_01C0FD8B.E1FEFD80
Content-Type: text/html;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content=3D"text/html; charset=3Diso-8859-1" =
http-equiv=3DContent-Type>
<META content=3D"MSHTML 5.00.3018.900" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT face=3DArial size=3D2>Il y a des exemples de sources mais en=20
allemand.</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=3DArial size=3D2>A noter qu'ils parlent de l'instruction =
"xchgcmp"=20
pour illustre le CAS et prennent l'exemple suivant :</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=3DArial size=3D2>
<DIV><FONT face=3DArial size=3D2>#define=20
INCREASE(x) &n=
bsp; =20
\<BR>asm=20
volatile(" &nb=
sp; =20
\<BR>0: mov =20
%1,%%eax\n =20
\<BR> =
mov =20
%%eax,%%ebx\n =
\<BR> =20
inc =20
%%ebx\n =20
\<BR> cmpxchg=20
%%ebx,%0\n =20
\<BR> =
jne =20
0b" &nbs=
p;=20
\<BR> : "=3Dm"=20
((x)) =20
\<BR> : "m"=20
((x)) &n=
bsp;=20
\<BR> : "eax", "ebx",=20
"cc");</FONT></DIV>
<DIV> </DIV></FONT></DIV>
<DIV><FONT face=3DArial size=3D2>En r=E9alit=E9, leur exemple n'est pas =
tr=E8s bon dans la=20
mesure o=F9 on peut faire simplement "lock; inc %0" =E0 la place. Par =
contre si on a=20
besoin de conna=EEtre la valeur avant l'incr=E9mentation atomique, il =
faut utiliser=20
=E0 la place "xadd" qui correspond =E0 la classe "fetch and modify" =
:</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=3DArial size=3D2>
<DIV><FONT face=3DArial size=3D2>#define INCREASE(x) \<BR>asm =
volatile("xadd=20
%1,%2" : "=3Da" (result) : "a"(1), "m" ((x)) =
: "cc");</FONT></DIV>
<DIV> </DIV>
<DIV>L=E0, deux processeurs ne peuvent pas lire en m=EAme temps la =
m=EAme valeur dans=20
leur registre "eax".</DIV>
<DIV> </DIV></FONT><BR> <A=20
href=3D"http://www.first.gmd.de/~fs/peace-pro97/non_blocking_sync/">http:=
//www.first.gmd.de/~fs/peace-pro97/non_blocking_sync/</A></DIV></BODY></H=
TML>
------=_NextPart_001_0024_01C0FD8B.E1FEFD80--
------=_NextPart_000_0023_01C0FD8B.E1FEFD80
Content-Type: application/octet-stream;
name="Non-Blocking Synchronization.url"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="Non-Blocking Synchronization.url"
[DEFAULT]
BASEURL=http://www.first.gmd.de/~fs/peace-pro97/non_blocking_sync/
[InternetShortcut]
URL=http://www.first.gmd.de/~fs/peace-pro97/non_blocking_sync/
Modified=90DBC82379FDC0018D
------=_NextPart_000_0023_01C0FD8B.E1FEFD80--