假设我们编写了一些可以同时使用或不使用的新类。显然,我们不希望锁定所有内容,因为它们可能会被同时调用。解决此问题的一种方法是通过指定锁定的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
是可交易的。