gpt4 book ai didi

c++ - 对软件事务内存友好的通用组件

转载 作者:太空狗 更新时间:2023-10-29 22:58:54 26 4
gpt4 key购买 nike

假设我们写了一些可以并发使用或不可以并发使用的新类。显然,我们不想锁定所有的东西,因为它们有可能被并发调用。解决此问题的一种方法是通过 mixins 进行参数化指定锁定:

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

并实例化 Locking,其中一个类在多线程情况下实际锁定,另一个情况下则不执行任何操作(希望编译器甚至可以优化调用)。

现在假设我想用软件事务内存而不是锁定来做到这一点。看着N3919 (或 gcc precursor ),想法不同。没有调用如

transaction_start();

transaction_end();

取而代之的是像这样的函数说明符

void bar() transaction_safe;

和 block 说明符,如

transaction { /* body */ }

有严格的后者调用前者的规则,并且任何看起来像它的东西都不能被 mixins 使用。

如何做到这一点(涉及预处理器)?还要注意 one of the main benefits of STM is composability , 但似乎没有办法让实例化来反射(reflect) bar 是可交易的。

最佳答案

以类似的方式,对于 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(); } }

对于属性,

A function is transaction-safe if it is not transaction-unsafe.

所以看起来您可以省略该关键字,让编译器/链接器完成该工作。

关于c++ - 对软件事务内存友好的通用组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38858799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com