3

假设我们编写了一些可以同时使用或不使用的新类。显然,我们不希望锁定所有内容,因为它们可能会被同时调用。解决此问题的一种方法是通过指定锁定的mixins进行参数化:

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 */ }

后者调用前者的严格规则,并且看起来没有任何东西可以被mixins使用。

如何做到这一点(涉及预处理器)?另请注意,STM 的主要优点之一是可组合性,但似乎没有办法让实例化来反映它bar是可交易的。

4

1 回答 1

1

以类似的方式,使用 lambda,您似乎可以执行以下操作:

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(); } }

对于属性,

如果一个函数不是事务不安全的,那么它就是事务安全的。

因此,您似乎可以省略该关键字,并让编译器/链接器完成这项工作。

于 2016-08-09T20:34:40.297 回答