0
3種類のロックを実装する必要があります。読み取り、書き込み、排他のためのロック。たとえば、tableという名前の抽象オブジェクトがあり、多くのトランザクションは異なるスレッドから機能します。読み取り、書き込み、および排他のためのロック
Aは、ロックがあなたが同時に異なるトランザクションからのデータを読み取ることができますが、トランザクションの1つは、書き込み用のテーブルを必要とする場合、それはすべてのロックが削除されて読まれるまで待つ必要があるロックですお読みください。
書き込みロックは、任意のトランザクションがテーブルから読み取ることができますが、1つのトランザクションのみがアクセスしているとき、書き込み用のテーブルを所有している1つのトランザクションのみがテーブル
に書き込むことができ、排他ロックがロックされロックが解除されるのを待ちます。
そして、私は、これはWINAPIを使用して実装することができ、C/C++ iの材料を勉強した後、その
class Table
{
void LockWrite()
{
if (LockLW.IsLock())
LockLW.wait_and_lock();
//
if (LockEx.IsLock())
LockEx.wait();
}
void LockExclusive()
{
{
// it is assumed that this is a thread-safe check
if (readers != 0)
FreeLockRead.wait();
}
//but there is a problem, because in this place some transactions have started to read again
if (LockLW.IsLock())
LockLW.wait_and_lock();
if (LockEx.IsLock())
LockEx.wait_and_lock();
}
void UnLockExclusive()
{
LockEx.unLock();
}
void LockRead()
{
if (LockEx.IsLock())
LockEx.wait();
//Set Lock Read
//a problem, because in this place one of transactions have got LockEx
readers += 1;
}
void UnLockRead()
{
readers -= 1;
if (readers == 0)
FreeLockRead.pulse();
}
mutex LockLW;
mutex LockEx;
event FreeLockRead;
atomic readers;
};
[this](http://en.cppreference.com/w/cpp/thread/shared_mutex)のようなものがトリックを行いますか? – Drop