[セットトップ]反発ロックによる読み書きロック

1531 ワード

昔、私は反発ロックと条件変数で読み書きロックを実現しました.これは読み書きロックが最も簡潔に実現されたのではないかと思っていました.しかし今日、「コンピュータシステムを深く理解する」第2版の12.5節を読むと、反発ロックだけで読み書きロックが実現できることが分かった.本の中で2つの反発ロックを使って読み書きロックを実現し、そのうちの1つの反発ロックは1つのスレッドにロックを加えることを許可し、もう1つのスレッドはロックを解除し、私の反発ロックの使い方に対する固有の思考を完全に覆し、素晴らしいと感じた.
本論文では,mutexとcondition_の2つの実装をc++でカプセル化した.variableは,それぞれ反発ロックと条件変数の擬似コードクラスを表す.
一、反発ロックと条件変数を使用して読み書きロックを実現する:
class readwrite_lock
{
public:
	readwrite_lock()
		: stat(0)
	{
	}

	void readLock()
	{
		mtx.lock();
		while (stat < 0)
			cond.wait(mtx);
		++stat;
		mtx.unlock();
	}

	void readUnlock()
	{
		mtx.lock();
		if (--stat == 0)
			cond.notify_one(); //           
		mtx.unlock();
	}

	void writeLock()
	{
		mtx.lock();
		while (stat != 0)
			cond.wait(mtx);
		stat = -1;
		mtx.unlock();
	}

	void writeUnlock()
	{
		mtx.lock();
		stat = 0;
		cond.notify_all(); //             
		mtx.unlock();
	}

private:
	mutex mtx;
	condition_variable cond;
	int stat; // == 0   ;> 0       ;< 0     
};

二、2つの反発ロックを使用して読み書きロックを実現する:
class readwrite_lock
{
public:
	readwrite_lock()
		: read_cnt(0)
	{
	}

	void readLock()
	{
		read_mtx.lock();
		if (++read_cnt == 1)
			write_mtx.lock();

		read_mtx.unlock();
	}

	void readUnlock()
	{
		read_mtx.lock();
		if (--read_cnt == 0)
			write_mtx.unlock();

		read_mtx.unlock();
	}

	void writeLock()
	{
		write_mtx.lock();
	}

	void writeUnlock()
	{
		write_mtx.unlock();
	}

private:
	mutex read_mtx;
	mutex write_mtx;
	int read_cnt; //       
};