<div><br><br><font size="1">Hello Mathew<br><br>Below I m attaching my simple code using ACE_RW_Process_Mutex and its output.<br><br>&nbsp;<br><br>Description of the problem--<br><br>I also tried it using ACE_Process_Mutex by just replacing the <font style="BACKGROUND-COLOR: #33ccff">ACE_RW_Process_Mutex</font> in code by ACE_Process_Mutex .With ACE_Process_Mutex ,synchronization is proper and writer and reader are acquiring and releasing in correct order .(when writer is releasing, then only reader is acquiring and vice versa. The output for the same is in last of the mail).<br>
<br>BUT when using ACE_RW_Process_Mutex ,the writer and reader are not in sync.<br><br>If we see the output for this as mentioned below, writer has acquired the mutex at <br><br>88112592 millisec and released at 88114592 millisec i..e writer is working for 2 sec and has acquired mutex for 2 sec.<br>
<br><font style="BACKGROUND-COLOR: #ffff66">(writer acquired&nbsp;&nbsp;&nbsp; 1&nbsp; &nbsp; at&nbsp;&nbsp; 88112592<br><br>&nbsp;writer released&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; at&nbsp;&nbsp; 88114592)<br></font><br>Now when we see the Reader, it has acquired the mutex at 88112872 millisec.<br>
<br><font style="BACKGROUND-COLOR: #33ff33">(Reader acquired&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88112872<br><br>Reader released&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88114872)<br></font><br>This should ideally not happen as mutex is still with the writer and it is relasing at 88114592 millisec.<br>
<br>&nbsp;int ACE_TMAIN (int argc, ACE_TCHAR *argv[])<br><br><br>{<br><br>int count =0;<br><br>float ltime=0;<br><br>&nbsp;&nbsp;&nbsp; <font style="BACKGROUND-COLOR: #33ccff">ACE_RW_Process_Mutex</font> m_RWMutex(ACE_TEXT(&quot;MyMutex&quot;));<br>
<br>&nbsp;&nbsp;&nbsp; if (agrc == 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // For server which is writing<br><br>&nbsp;&nbsp;&nbsp; {<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (1)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (m_RWMutex.acquire_write() == 0)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ltime = ::GetTickCount();&nbsp; //number of millisec since the system has started<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_OS::printf(&quot;Writer acquired...%d&nbsp; at: %f\n&quot;,count++,ltime);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_OS::sleep(2);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ltime = ::GetTickCount();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_OS::printf(&quot;Writer releasing... ...%d&nbsp; at: %f\n&quot;,count++,ltime);<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_RWMutex.release();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //For Client which is reading <br><br>&nbsp;&nbsp;&nbsp; {<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (1)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br><br>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (m_RWMutex.acquire_read() == 0)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ltime = ::GetTickCount(); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; ACE_OS::printf(&quot;Reader acquired... ...%d&nbsp; at: %f\n&quot;,count++,ltime);<br><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_OS::sleep(2);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ltime = ::GetTickCount();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_OS::printf(&quot;Reader releasing...%d&nbsp; at: %f\n&quot;,count++,ltime);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_RWMutex.release();<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return 0;<br><br>}</font></div>
<div><font size="1"></font>&nbsp;</div>
<div><font size="1">OUTPUT&nbsp;&nbsp;is like this(WITH ACE_RW_Process_Mutex):<br>&nbsp;<br><br><br>Writer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeStamp(in millisec)&nbsp;<br><br><br>writer acquired&nbsp;&nbsp;&nbsp; 0 &nbsp;&nbsp; at&nbsp;&nbsp; 88110592&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br>writer released&nbsp;&nbsp;&nbsp; 0 &nbsp;&nbsp; at&nbsp;&nbsp; 88112592<br>
<br><font style="BACKGROUND-COLOR: #ffff00">writer acquired&nbsp;&nbsp;&nbsp; 1&nbsp; &nbsp; at&nbsp;&nbsp; 88112592<br><br>writer released&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; at&nbsp;&nbsp; 88114592<br></font><br>writer acquired&nbsp;&nbsp;&nbsp; 2&nbsp; &nbsp; at&nbsp;&nbsp; 88114592<br><br>writer released&nbsp;&nbsp;&nbsp; 2&nbsp; &nbsp; at&nbsp;&nbsp; 88116592<br>
<br>writer acquired&nbsp;&nbsp;&nbsp; 3 &nbsp;&nbsp; at&nbsp;&nbsp; 88116592<br><br>writer released &nbsp;&nbsp;&nbsp;3 &nbsp;&nbsp; at&nbsp;&nbsp; 88118592<br><br>&nbsp;<br><br>Reader<br><br><font style="BACKGROUND-COLOR: #33ff33">Reader acquired&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88112872<br><br>Reader released&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88114872<br>
</font><br>Reader acquired&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88114872<br><br>Reader released&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88116872<br><br>Reader acquired&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88116872<br><br>Reader released&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88118872<br><br>Reader acquired&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88118872<br>
<br>&nbsp;<br><br>&nbsp;<br><br>OUTPUT is like this (WITH ACE_Process_Mutex):<br><br>&nbsp;<br><br>Writer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeStamp(in millisec)<br><br>&nbsp;<br><br><font style="BACKGROUND-COLOR: #ffff00">writer acquired&nbsp;&nbsp;&nbsp; 0 &nbsp;&nbsp; at&nbsp;&nbsp;&nbsp; 88560984<br>
<br>writer released&nbsp;&nbsp;&nbsp; 0 &nbsp;&nbsp; at&nbsp;&nbsp; 88562984<br><br></font>writer acquired&nbsp;&nbsp;&nbsp; 1&nbsp; &nbsp; at&nbsp;&nbsp; 88562984<br><br>writer released&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; at&nbsp;&nbsp; 88564984<br><br>writer acquired&nbsp;&nbsp;&nbsp; 2&nbsp; &nbsp; at&nbsp;&nbsp; 88566984<br><br>writer released&nbsp;&nbsp;&nbsp; 2&nbsp; &nbsp; at &nbsp;&nbsp;88568984<br>
<br>writer acquired&nbsp;&nbsp;&nbsp; 3 &nbsp;&nbsp; at&nbsp;&nbsp; 88570984<br><br>writer released&nbsp;&nbsp;&nbsp; 3 &nbsp;&nbsp; at&nbsp;&nbsp; 88572984<br><br>&nbsp;<br><br>Reader<br><br><font style="BACKGROUND-COLOR: #33ff33">Reader acquired&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88564984<br><br>Reader released&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88566984<br>
</font><br>Reader acquired&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88568984<br><br>Reader released&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88570984<br><br>Reader acquired&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88572984<br><br>Reader released&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88574984<br><br>Reader acquired&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88576984<br>
<br>Reader released&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp; at&nbsp;&nbsp; 88578984<br><br>&nbsp;<br><br>Thanks<br><br>Kul<br><br><br><br>&nbsp;<br><br>On 3/3/08, Matthew Gillen &lt;<a href="mailto:mgillen@bbn.com">mgillen@bbn.com</a>&gt; wrote: <br><br>kul gupta wrote:<br>
&gt; After having a look into ACE_ROOT/examples/Threads ,I implemented the<br>&gt; following code using ACE_RW_Process_Mutex. and run in both Windows and<br>&gt; linux5.0. But in both the cases the synchronization is not happening .<br>
<br>It would help if were more specific about what actually /is/ happening.&nbsp;&nbsp;Do<br>you see the output messages in the wrong order?&nbsp;&nbsp;Do you never see some<br>output messages?<br><br>Matt<br><br>&nbsp;<br><br>&nbsp;</font></div>