Общие компоненты, дружественные к программной транзакционной памяти

Скажем, мы пишем какой-то новый класс, который может использоваться одновременно или нет. Очевидно, что мы не хотим блокировать все на случай, если они будут вызваны одновременно. Одним из способов решения этой проблемы является параметризация с помощью миксинов, определяющих блокировку:

template<class Locking>
struct foo : private Locking {
    void bar() {
        Locking::read_lock();
        // Do something.
        Locking::read_unlock();
    }
};

и создание экземпляров Locking с классом, который фактически блокируется для случая многопоточности, и с классом, который не выполняет никаких операций в другом случае (надеюсь, компилятор даже оптимизирует вызовы).

Теперь предположим, что я хотел бы сделать это с программно-транзакционной памятью вместо блокировки. Глядя на N3919 (или предшественник gcc), идея другая. Там нет звонков, таких как

transaction_start();

transaction_end();

Вместо этого есть спецификаторы функций, такие как

void bar() transaction_safe;

и блок спецификаторов, как

transaction { /* body */ }

со строгими правилами последнего вызова первого, и ничто из того, что выглядит так, не может быть использовано миксинами.

Как это можно сделать (без привлечения препроцессора)? Также обратите внимание, что одним из главных преимуществ STM является возможность компоновки, но, похоже, нет способа заставить экземпляр отражать это bar является предметом сделки.

1 ответ

Решение

Аналогично, с лямбдой кажется, что вы можете сделать что-то вроде:

template<class Transaction>
struct foo {
    void bar() {
        Transaction::run([](){ /* Do something. */ });
    }
};

с 2 реализациями

template<typename F>
void TransactionNone::run(F f) { f(); }

а также

template<typename F>
void TransactionReal::run(F f) { transaction{ f(); } }

Для атрибутов

Функция безопасна для транзакций, если она не безопасна для транзакций.

Таким образом, вы можете опустить это ключевое слово и позволить компилятору / компоновщику выполнить эту работу.

Другие вопросы по тегам