Concurrency semop是否对所有SOP进行原子化检查?
我正在使用semop实现R/W锁,如下所示。 我的问题是:semop是否对所有SOP进行原子化检查?比如,semop先添加一些锁,然后逐个检查这三个SOP 如果没有,是否会发生以下情况? 当一个线程调用CSemRWLock::CWriteLock::lock时,通过检查第一个SOP发现没有读取器,然后转到第二个SOP。同时,另一个调用CReadLock::lock的线程将第一个值更改为非零值。两个线程都获得锁,一个读取,一个写入 如果是这样,CWriteLock::lock需要交换前两个SOP,首先指定有writer,然后判断没有读卡器。对吧?Concurrency semop是否对所有SOP进行原子化检查?,concurrency,locking,Concurrency,Locking,我正在使用semop实现R/W锁,如下所示。 我的问题是:semop是否对所有SOP进行原子化检查?比如,semop先添加一些锁,然后逐个检查这三个SOP 如果没有,是否会发生以下情况? 当一个线程调用CSemRWLock::CWriteLock::lock时,通过检查第一个SOP发现没有读取器,然后转到第二个SOP。同时,另一个调用CReadLock::lock的线程将第一个值更改为非零值。两个线程都获得锁,一个读取,一个写入 如果是这样,CWriteLock::lock需要交换前两个SOP,
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);
......
}