<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/salarypg66/">
    <title>salarypg66 @ ウィキ</title>
    <link>http://w.atwiki.jp/salarypg66/</link>
    <atom:link href="https://w.atwiki.jp/salarypg66/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>salarypg66 @ ウィキ</description>

    <dc:language>ja</dc:language>
    <dc:date>2007-02-22T10:25:34+09:00</dc:date>
    <utime>1172107534</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/salarypg66/pages/7.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/salarypg66/pages/5.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/salarypg66/pages/4.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/salarypg66/pages/7.html">
    <title>C++で書いてみるてすと。</title>
    <link>https://w.atwiki.jp/salarypg66/pages/7.html</link>
    <description>
      *templateで自動lock/unlockのてすと
**解説
コンストラクタ/デストラクタをつかって、mutexなど同期プリミティブのlock/unlockをブロックの突入/脱出で自動的にやってみるテスト。

MFCにも似たようなのがあったが、method が仮想化されていて組み込みにはruntimeコストが機能のわりにはちょっと大げさな気がする。継承+仮想関数に代えてtemplate使えば、同期プリミティブをmutexやsemaphore, spinlockと色々選択できて、なおかつbuildtimeに解決しているのでruntimeコストは大げさにならない。 inline展開を期待して、普通にpthread_mutex_lock(),pthread_mutex_unlock()を使うのと変わらんだろ。 (と思う)
*コード
 #include &lt;pthread.h&gt;
 
 template&lt;typename lock_type&gt;
 class auto_lock {
 public:
   auto_lock(lock_type* lockref)
     : _lockref(lockref) { _lockref-&gt;lock(); }
   ~auto_lock()
     { _lockref-&gt;unlock(); }
 private:
   lock_type* _lockref;
 
   auto_lock();
   auto_lock(const auto_lock&amp;);
   auto_lock&amp; operator=(const auto_lock&amp;);
   bool operator==(const auto_lock&amp;);
 };
 
 class mutex
 {
 public:
   mutex()
     { posix_mutex = PTHREAD_MUTEX_INITIALIZER; }
   ~mutex()
     { pthread_mutex_destroy(&amp;posix_mutex); }
   void lock()
     { pthread_mutex_lock(&amp;posix_mutex); }
   void unlock()
     { pthread_mutex_unlock(&amp;posix_mutex); }
 private:
   pthread_mutex_t posix_mutex;
 
   mutex(const mutex&amp;);
   mutex&amp; operator=(const mutex&amp;);
   bool operator==(const mutex&amp;);
 };
 
 mutex my_mutex;
 
 int thread_main()
 {
   {
     auto_lock&lt;mutex&gt; m(&amp;my_mutex);
       // mymutexで排他制御されたブロック
   }
   return 0;
 }

それでも、C++の醍醐味はやっぱ継承とポロモでしょ。ていう場合もあるかも。

 class lockable
 {
 public:
   virtual ~lockable() {}
   virtual void lock() = 0;
   virtual void unlock() = 0;
 };
 
 template&lt;typename lock_type&gt;
 class virtual_lock
     : public lockable
 {
 public:
   virtual_lock() {}
   ~virtual_lock() {}
   virtual void lock()
     {_lockobj.lock();}
   virtual void unlock()
     {_lockobj.unlock();}
 private:
   lock_type _lockobj;
 
   virtual_lock(const virtual_lock&amp;);
   virtual_lock&amp; operator=(const virtual_lock&amp;);
   bool operator==(const virtual_lock&amp;);
 
 };
 
 void hogehoge(lockable *lock)
 {
   auto_lock&lt;lockable&gt; l(lock);
     // 省略
 }
 
 virtual_lock&lt;mutex&gt; my_virtual_mutex;
 
 void hoge1()
 {
   hogehoge(&amp;my_virtual_mutex);
 }

すでにあるvirtual_lock&lt;mutex&gt;じゃないmutexはどうするの？てな場合むけ。 

 #include &lt;assert.h&gt;
 
 template&lt;typename lock_type&gt;
   class virtual_lock&lt;lock_type*&gt;
     : public lockable
 {
 public:
   virtual_lock()
     : _lockref(NULL) {}
   virtual_lock(lock_type *lock)
     : _lockref(lock) {}
   void assign(lock_type *lock)
     {_lockref = lock;}
   ~virtual_lock() {}
   virtual void lock()
     {assert(_lockref != NULL); _lockref-&gt;lock();}
   virtual void unlock()
     {assert(_lockref != NULL); _lockref-&gt;unlock();}
 private:
   lock_type* _lockref;
 
   virtual_lock(const virtual_lock&amp;);
   virtual_lock&amp; operator=(const virtual_lock&amp;);
   bool operator==(const virtual_lock&amp;);
 };
 
 void hoge2()
 {
 
   hogehoge(
     &amp;virtual_lock&lt;mutex*&gt;(&amp;my_mutex)
   );
 }    </description>
    <dc:date>2007-02-22T10:25:34+09:00</dc:date>
    <utime>1172107534</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/salarypg66/pages/5.html">
    <title>サイド</title>
    <link>https://w.atwiki.jp/salarypg66/pages/5.html</link>
    <description>
      *更新履歴
#recent()

*閑古鳥カウンター
-Total: &amp;counter()
-Yesterday: &amp;counter(yesterday)
-Today: &amp;counter(today)    </description>
    <dc:date>2007-02-22T02:10:37+09:00</dc:date>
    <utime>1172077837</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/salarypg66/pages/4.html">
    <title>トップページ</title>
    <link>https://w.atwiki.jp/salarypg66/pages/4.html</link>
    <description>
      *66式サラリーPGのコード置き場

よく来たな、まあ座れ。    </description>
    <dc:date>2007-02-22T02:04:31+09:00</dc:date>
    <utime>1172077471</utime>
  </item>
  </rdf:RDF>
