我用semop实现R / W锁定如下。 我的问题是:semop以原子方式检查所有sops?就像,semop首先添加一些锁,然后逐个检查这三个。
如果没有,可以发生以下情况吗? 当一个线程调用CSemRWLock :: CWriteLock :: lock()时,通过检查第一个sops发现没有读者,并转到第二个sops。同时,另一个调用CReadLock :: lock()的线程将第一个值更改为非零值。两个线程都获得锁定,一个读取和一个写入。
如果是这样,CWriteLock :: lock()需要交换前两个sops,首先指定writer,然后判断没有读者。正确?
bool CSemRWLock::CWriteLock::lock()
{
//judge no reader
sbuf[0].sem_num = 0;
sbuf[0].sem_op = 0;
sbuf[0].sem_flg = 0;
//specify there is writer
sbuf[1].sem_num = 1;
sbuf[1].sem_op = 1;
sbuf[1].sem_flg = SEM_UNDO;
//occupy the writter resource
sbuf[2].sem_num = 2;
sbuf[2].sem_op = -1;
sbuf[2].sem_flg = SEM_UNDO;
semop(m_iSemID, sbuf, 3)
......
}
bool CSemRWLock::CReadLock::lock()
{
//add a reader
sbuf[0].sem_num = 0;
sbuf[0].sem_op = 1;
sbuf[0].sem_flg = SEM_UNDO;
//judge no writer
sbuf[1].sem_num = 1;
sbuf[1].sem_op = 0;
sbuf[1].sem_flg = 0;
semop(m_iSemID, sbuf, 2);
......
}