<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Assuming you are looking at a memory coherency issue, think of it like this...<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
CPU0<br>
    cache0</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
                         sharedMemory<br>
    cache1<br>
CPU1<br>
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Your old code brought the volatile struct in from disk into cache0 a long time before it was used by CPU1.</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span style="color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif; font-size: 12pt;">    struct inited into cache0 by disk read</span><br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
    ... long time elapses</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
    cache0 version of struct gets flushed to sharedMemory</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
    ... long time elapses</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
    CPU0 tells CPU1 to use struct</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
    CPU1 reads sharedMemory to get struct into cache1</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
    CPU1 uses the values from struct<br>
<br>
Your new code does it MUCH later</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
<div style="margin:0px;font-size:12pt"><span style="margin:0px;font-size:12pt"><span style="margin:0px">    struct inited into cache0 by instructions</span></span></div>
<div style="margin:0px;font-size:12pt">    <b>NOTHING FLUSHES</b> cache0 to sharedMemory</div>
<div style="margin:0px;font-size:12pt">    <b>ALMOST NO TIME ELAPSES</b></div>
<div style="margin:0px;font-size:12pt">    CPU0 tells CPU1 to use struct</div>
<div style="margin:0px;font-size:12pt">    CPU1 reads sharedMemory to get struct into cache1</div>
<span style="margin:0px;font-size:12pt"><span style="margin:0px;font-size:12pt;background-color:rgb(255, 255, 255)">   <span> </span><b>PERHAPS A LONG TIME AFTER THAT READ</b><span> </span>cache0 is flushed sharedMemory</span></span></div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span style="margin:0px;font-size:12pt">    CPU1 uses the values from the uninitialized values of struct<br>
</span><br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
or worse<br>
<div style="margin:0px;font-size:12pt"><span style="margin:0px"><span style="margin:0px"><span style="margin:0px"><br>
</span></span></span></div>
<div style="margin:0px;font-size:12pt"><span style="margin:0px"><span style="margin:0px"><span style="margin:0px">    struct inited into cache0 by instructions</span></span></span>
<div style="margin:0px">   <span> </span><b>NOTHING FLUSHES</b><span> </span>cache0 to sharedMemory</div>
<div style="margin:0px">   <span> </span><b>ALMOST NO TIME ELAPSES</b></div>
<div style="margin:0px"><span style="margin:0px;background-color:rgb(255, 255, 255)">    CPU1 reads something near struct from sharedMemory getting the uninited struct into cache1</span></div>
<div style="margin:0px">    CPU0 tells CPU1 to use struct</div>
<div style="margin:0px">    CPU1 reads sharedMemory from cache1 getting an uninitialized struct</div>
<span style="margin:0px"><span style="margin:0px;background-color:rgb(255, 255, 255)">   <span style="margin:0px"> </span><b>PERHAPS A LONG TIME AFTER THAT READ</b><span style="margin:0px"> </span>cache0 is flushed sharedMemory</span></span></div>
<span style="margin:0px;font-size:12pt"><span style="margin:0px">    CPU1 uses the values from the uninitialized values of struct<br>
</span></span><br>
Depending on the h/w, memory flushes may be needed to force the CPU0 to write the data to the shared memory, and memory barriers may be needed to stop CPU1 from reading the earlier versions of the data.<br>
<br>
As has been mentioned previously, volatile by itself does not necessarily cause these flushes and barriers to be needed<br>
<br>
</div>
</body>
</html>