Есть ли способ реализовать двухфазную блокировку в Rust? Практически невозможно реализовать фазу роста - PullRequest
0 голосов
/ 09 апреля 2020

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, как только становится владельцем выпущенный. Я попытался передать право собственности, добавив его к вектору. Это приводит к ошибке, так как защита замка является заимствованным значением.

...