实现思路:无写锁和读锁时readercount为1
尝试获取读锁:
对readercount进行compare_exchange,expected为1,value为expected+1
分析三种情况:
1:cas成功,读锁获取成功,readercount变为2
2:cas失败,expected变为readercount内的值
2.1:expected == 0 ,获取读锁失败
2.2:expected > 1 ,重新循环直到 expected == 0 或 compare_exchange 成功
尝试获取写锁:
对readercount进行compare_exchange,expected为1,value为0
两种情况:
1:cas成功,读锁获取成功,readercount变为0
2:cas失败,读锁获取失败,直接返回
释放读锁:
简单的对readercount进行fetch_sub(1)
释放写锁:
简单的对readercount进行fetch_add(1)
//现在想起来store(1)就行了。。。
尝试获取读锁:
对readercount进行compare_exchange,expected为1,value为expected+1
分析三种情况:
1:cas成功,读锁获取成功,readercount变为2
2:cas失败,expected变为readercount内的值
2.1:expected == 0 ,获取读锁失败
2.2:expected > 1 ,重新循环直到 expected == 0 或 compare_exchange 成功
尝试获取写锁:
对readercount进行compare_exchange,expected为1,value为0
两种情况:
1:cas成功,读锁获取成功,readercount变为0
2:cas失败,读锁获取失败,直接返回
释放读锁:
简单的对readercount进行fetch_sub(1)
释放写锁:
简单的对readercount进行fetch_add(1)
//现在想起来store(1)就行了。。。