c - does read / write atomicity hold on multi-computer memory? -
i'm working in multi-computer environment 2 computers access same memory on 32bit pci bus.
the first computer write 32bit int.
*int_pointer = number;
the second computer read 32bit int.
number = *int_pointer;
both os's / cpu's 32bit architecture.
computer pci intel based.
computer on pci card power pc.
the case worried if write computer changing variable @ same time read computer reading it, causing invalid data read computer.
i'd know if atomicity of reading / writing same position in memory preserved on multiple computers.
if so, following prevent race condition:
number = *int_pointer; while(*int_pointer != number) { number = *int_pointer; }
i can guarantee writes occur every 16ms*, , reads occur randomly.
*times drift since both computers have different timers.
there isn't enough information answer definitively.
if either of cpus decide cache memory @ *int_pointer
, fail , code not fix race condition.
assuming both cpus know memory @ *int_pointer
uncacheable, and location *int_pointer
aligned on 4-byte/32-bit boundary and cpu on pci card has 32 bit memory interface, and pointer declared pointer volatile
and both c compilers implement volatile correctly, updates atomic.
if of above conditions not met, result unpredictable , "race detection" code not work.
edited explain why volatile
needed:
here race condition code compiled mips assembler -o4
, no volatile
qualifier. (i used mips because generated code easier read x86 code):
int nonvol(int *ip) { int number = *ip; while (*ip != number) { number = *ip; } return number; }
disassembly output:
00000000 <nonvol>: 0: 8c820000 lw v0,0(a0) 4: 03e00008 jr ra
the compiler has optimized while
loop away since knows *ip
cannot change.
here's happens volatile
, same compiler options:
int vol(volatile int *ip) { int number = *ip; while (*ip != number) { number = *ip; } return number; }
disassembly output:
00000008 <vol>: 8: 8c820000 lw v0,0(a0) c: 8c830000 lw v1,0(a0) 10: 1443fffd bne v0,v1,8 <vol> 14: 00000000 nop 18: 03e00008 jr ra
now while
loop not optimized away because using volatile
has told compiler *ip
can change @ time.
Comments
Post a Comment