|
|
От: |
vdimas
|
|
| Дата: | 07.07.15 10:34 | ||
| Оценка: |
|
||
WH> private volatile int version;
WH> private volatile bool isWriterInProgress;
WH>Обратное гарантируется Release fence, т.е. volatile write.Термин volatile read означает чтение памяти в сочетании с созданием accure fence.
Accure fence гарантирует что инструкции, стоящие после барьера, не будут перемещены в позицию до барьера.
private bucket[] buckets; // без volatile
...
bucket[] lbuckets = buckets;
...
do
{
int currentversion;
int spinCount = 0;
do {
// this is violate read, following memory accesses can not be moved ahead of it.
currentversion = version;
b = lbuckets[bucketNumber];
...
} while ( isWriterInProgress || (currentversion != version) ); isWriterInProgress = true;
// Clear hash_coll field, then key, then value
buckets[bn].hash_coll &= unchecked((int)0x80000000);
if (buckets[bn].hash_coll != 0) {
buckets[bn].key = buckets;
}
else {
buckets[bn].key = null;
}
buckets[bn].val = null; // Free object references sooner & simplify ContainsValue.
count--;
UpdateVersion();
isWriterInProgress = false;