<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic reader_writer_mutex with no memory barriers on reader side in Intel® Moderncode for Parallel Architectures</title>
    <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/reader-writer-mutex-with-no-memory-barriers-on-reader-side/m-p/851027#M1875</link>
    <description>&lt;P&gt;reader_writer_mutex with no memory barriers on reader side. No joke!&lt;BR /&gt;&lt;/P&gt;&lt;P&gt; Here is the sketch:&lt;BR /&gt;&lt;BR /&gt; &lt;/P&gt;&lt;P&gt;class rw_mutex_t&lt;BR /&gt; { &lt;BR /&gt; private: &lt;BR /&gt;   mutex_t guard; &lt;BR /&gt;   unsigned reader_count; &lt;BR /&gt;   bool volatile writer_pending; &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;public: &lt;BR /&gt;   rw_mutex_t() &lt;BR /&gt;     : reader_count() &lt;BR /&gt;     , writer_pending() &lt;BR /&gt;   {} &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;  void register_reader() &lt;BR /&gt;   { &lt;BR /&gt;     lock_t lock (guard); &lt;BR /&gt;     ++reader_count; &lt;BR /&gt;   } &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;  void unregister_reader() &lt;BR /&gt;   { &lt;BR /&gt;     notify_writer(); &lt;BR /&gt;     lock_t lock (guard); &lt;BR /&gt;     --reader_count; &lt;BR /&gt;   } &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;  void reader_lock() &lt;BR /&gt;   { &lt;BR /&gt;     if (writer_pending) &lt;BR /&gt;     { &lt;BR /&gt;       notify_writer(); &lt;BR /&gt;       wait_for_writer_notification(); &lt;BR /&gt;     } &lt;BR /&gt;   } &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;  void reader_unlock() &lt;BR /&gt;   { &lt;BR /&gt;   } &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;  void writer_lock() &lt;BR /&gt;   { &lt;BR /&gt;     guard.lock(); &lt;BR /&gt;     writer_pending = true; &lt;BR /&gt;     wait_for_all_readers_notifications(); &lt;BR /&gt;     writer_pending = false; &lt;BR /&gt;   } &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;  void writer_unlock() &lt;BR /&gt;   { &lt;BR /&gt;     notify_all_readers(); &lt;BR /&gt;     guard.unlock(); &lt;BR /&gt;   } &lt;BR /&gt; &lt;/P&gt;};&lt;BR /&gt;&lt;BR /&gt;------------------------------&lt;BR /&gt;&lt;P&gt;Usage example: &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;rw_mutex_t guard; &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;void reader_thread() &lt;BR /&gt; { &lt;BR /&gt;   guard.register_reader(); &lt;BR /&gt;   while (!stop) &lt;BR /&gt;   { &lt;BR /&gt;     guard.reader_lock(); &lt;BR /&gt;     read_some(); &lt;BR /&gt;     guard.reader_unlock(); &lt;BR /&gt;   } &lt;BR /&gt;   guard.unregister_reader(); &lt;BR /&gt; &lt;/P&gt;&lt;DIV id="qhide_295024" style="display: block;" class="qt"&gt;} &lt;BR /&gt; &lt;BR /&gt;&lt;/DIV&gt;void writer_thread() &lt;BR /&gt; { &lt;BR /&gt;   while (!stop) &lt;BR /&gt;   { &lt;BR /&gt;     guard.writer_lock(); &lt;BR /&gt;     write_some(); &lt;BR /&gt;     guard.writer_unlock(); &lt;BR /&gt;     sleep_some(); &lt;BR /&gt;   } &lt;BR /&gt; } &lt;BR /&gt;&lt;BR /&gt;------------------------------&lt;BR /&gt;&lt;BR /&gt;This mutex is completely new and unpatented and specially put in public domain for free use.&lt;BR /&gt;
&lt;P&gt;Reader must periodically execute reader_lock()/ &lt;BR /&gt; reader_unlock() while he is registered. Else it will prevent writer &lt;BR /&gt; from acquiring the mutex. &lt;BR /&gt;&lt;/P&gt;This mutex put additional requirements on reader and writer code. You can see additional thoughts and comments on idea and implementation here:&lt;BR /&gt;&lt;A href="http://groups.google.ru/group/comp.programming.threads/browse_frm/thread/b7d3b8c08f9ca3c6/#" target="_blank"&gt;http://groups.google.ru/group/comp.programming.threads/browse_frm/thread/b7d3b8c08f9ca3c6/#&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;Comments and thoughts are appreciated.&lt;BR /&gt;&lt;P&gt;Dmitriy V'jukov &lt;/P&gt;</description>
    <pubDate>Sun, 24 Jun 2007 21:37:38 GMT</pubDate>
    <dc:creator>Dmitry_Vyukov</dc:creator>
    <dc:date>2007-06-24T21:37:38Z</dc:date>
    <item>
      <title>reader_writer_mutex with no memory barriers on reader side</title>
      <link>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/reader-writer-mutex-with-no-memory-barriers-on-reader-side/m-p/851027#M1875</link>
      <description>&lt;P&gt;reader_writer_mutex with no memory barriers on reader side. No joke!&lt;BR /&gt;&lt;/P&gt;&lt;P&gt; Here is the sketch:&lt;BR /&gt;&lt;BR /&gt; &lt;/P&gt;&lt;P&gt;class rw_mutex_t&lt;BR /&gt; { &lt;BR /&gt; private: &lt;BR /&gt;   mutex_t guard; &lt;BR /&gt;   unsigned reader_count; &lt;BR /&gt;   bool volatile writer_pending; &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;public: &lt;BR /&gt;   rw_mutex_t() &lt;BR /&gt;     : reader_count() &lt;BR /&gt;     , writer_pending() &lt;BR /&gt;   {} &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;  void register_reader() &lt;BR /&gt;   { &lt;BR /&gt;     lock_t lock (guard); &lt;BR /&gt;     ++reader_count; &lt;BR /&gt;   } &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;  void unregister_reader() &lt;BR /&gt;   { &lt;BR /&gt;     notify_writer(); &lt;BR /&gt;     lock_t lock (guard); &lt;BR /&gt;     --reader_count; &lt;BR /&gt;   } &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;  void reader_lock() &lt;BR /&gt;   { &lt;BR /&gt;     if (writer_pending) &lt;BR /&gt;     { &lt;BR /&gt;       notify_writer(); &lt;BR /&gt;       wait_for_writer_notification(); &lt;BR /&gt;     } &lt;BR /&gt;   } &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;  void reader_unlock() &lt;BR /&gt;   { &lt;BR /&gt;   } &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;  void writer_lock() &lt;BR /&gt;   { &lt;BR /&gt;     guard.lock(); &lt;BR /&gt;     writer_pending = true; &lt;BR /&gt;     wait_for_all_readers_notifications(); &lt;BR /&gt;     writer_pending = false; &lt;BR /&gt;   } &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;  void writer_unlock() &lt;BR /&gt;   { &lt;BR /&gt;     notify_all_readers(); &lt;BR /&gt;     guard.unlock(); &lt;BR /&gt;   } &lt;BR /&gt; &lt;/P&gt;};&lt;BR /&gt;&lt;BR /&gt;------------------------------&lt;BR /&gt;&lt;P&gt;Usage example: &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;rw_mutex_t guard; &lt;BR /&gt; &lt;/P&gt;&lt;P&gt;void reader_thread() &lt;BR /&gt; { &lt;BR /&gt;   guard.register_reader(); &lt;BR /&gt;   while (!stop) &lt;BR /&gt;   { &lt;BR /&gt;     guard.reader_lock(); &lt;BR /&gt;     read_some(); &lt;BR /&gt;     guard.reader_unlock(); &lt;BR /&gt;   } &lt;BR /&gt;   guard.unregister_reader(); &lt;BR /&gt; &lt;/P&gt;&lt;DIV id="qhide_295024" style="display: block;" class="qt"&gt;} &lt;BR /&gt; &lt;BR /&gt;&lt;/DIV&gt;void writer_thread() &lt;BR /&gt; { &lt;BR /&gt;   while (!stop) &lt;BR /&gt;   { &lt;BR /&gt;     guard.writer_lock(); &lt;BR /&gt;     write_some(); &lt;BR /&gt;     guard.writer_unlock(); &lt;BR /&gt;     sleep_some(); &lt;BR /&gt;   } &lt;BR /&gt; } &lt;BR /&gt;&lt;BR /&gt;------------------------------&lt;BR /&gt;&lt;BR /&gt;This mutex is completely new and unpatented and specially put in public domain for free use.&lt;BR /&gt;
&lt;P&gt;Reader must periodically execute reader_lock()/ &lt;BR /&gt; reader_unlock() while he is registered. Else it will prevent writer &lt;BR /&gt; from acquiring the mutex. &lt;BR /&gt;&lt;/P&gt;This mutex put additional requirements on reader and writer code. You can see additional thoughts and comments on idea and implementation here:&lt;BR /&gt;&lt;A href="http://groups.google.ru/group/comp.programming.threads/browse_frm/thread/b7d3b8c08f9ca3c6/#" target="_blank"&gt;http://groups.google.ru/group/comp.programming.threads/browse_frm/thread/b7d3b8c08f9ca3c6/#&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;Comments and thoughts are appreciated.&lt;BR /&gt;&lt;P&gt;Dmitriy V'jukov &lt;/P&gt;</description>
      <pubDate>Sun, 24 Jun 2007 21:37:38 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Moderncode-for-Parallel/reader-writer-mutex-with-no-memory-barriers-on-reader-side/m-p/851027#M1875</guid>
      <dc:creator>Dmitry_Vyukov</dc:creator>
      <dc:date>2007-06-24T21:37:38Z</dc:date>
    </item>
  </channel>
</rss>

