C ++ Реализация:
//growing phase
for (int index : sorted_transaction) {
Row &row = table[index];
row.lock.lock();
}
//critical section
for (int index : random_transaction) {
Row &row = table[index];
int row_data = row.getData();
row_data += 1;
row.setData(row_data);
}
//shrinking phase
for (int index : sorted_transaction) {
Row &row = table[index];
row.lock.unlock();
}
Rust Attempt
let mut acquired_locks: Vec<&MutexGuard<i32>> = Vec::new();
// sort phase
sorted_readset.rdxsort();
// growing phase
for index in sorted_readset {
let u_index = index as usize;
let row = &table[u_index];
let guard = row.lock.lock().unwrap();
acquired_locks.push(&guard);
}
//critical section
for index in random_readset {
let u_index = index as usize;
let mut row = &mut table[u_index];
row.value = row.value + 1;
}
//since this will become out of scope, it'll automatically shrink
Как вы можете видеть, это невозможно, поскольку Mutex немедленно освобождается после выхода из l oop, как только становится владельцем выпущенный. Я попытался передать право собственности, добавив его к вектору. Это приводит к ошибке, так как защита замка является заимствованным значением.