问题标签 [transactional-memory]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 硬件事务内存:_xbegin() 返回 0
通过 gcc 文档:x86-transactional-memory-intrinsics.html,当事务失败/中止时,_xbegin()应该返回中止状态。但是,我发现它有时会返回 0。而且频率非常高。**_xbegin()**会在什么情况下返回0?
检查手册后,我发现很多情况都可能导致此结果。例如,CPUID、SYSTEMCALL、CFLUSH.etc。但是,我认为我的代码没有触发其中任何一个。
这是我的代码:模拟一家小银行,一个随机账户将 1 美元转移到另一个账户。
补充:
- 所有帐户都是 64 位对齐的。我打印了 bank->accounts[0], bank->accounts 1地址。0xf41080,0xf410c0。</li>
- 使用 -O0
asm volatile("":::"memory");
因此没有指令重新排序问题。 中止率随时间增加。这是结果
/li>即使 n_threads 为 1,结果也是一样的。
如果我按如下方式在回退后添加粗锁,结果似乎是正确的。
/li>
c++ - 将函数声明为 transaction_safe 就足够了,这样它们就可以线程安全地使用了吗?
仅仅像我的类中那样声明所有函数就足够了,所以它可以在实验事务内存 TStransaction_safe
的事务中用作线程安全的吗?atomic_noexcept, atomic_cancel, atomic_commit
众所周知,Experimental C++ 标准库中有事务内存 TS (ISO/IEC TS 19841:2015)。简单的例子在这里:http ://en.cppreference.com/w/cpp/language/transactional_memory
还有事务性内存的 C++ 扩展技术规范:http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4514.pdf
第 34 页:
即,如果事务内存将提交给 C++ 标准,那么我们可以简单地做这样的事情并且它是线程安全的吗?
不幸的是,即使在 GCC 6.1 上atomic_cancel {}
使用密钥,我也无法重现示例: https ://godbolt.org/g/UcV4wI-fgnu-tm
并且足以像transaction_safe
在我的某些类中那样声明所有函数,因此它可以用作线程安全的 - 如果我将在范围内调用它:atomic_cancel { obj.func(); }
?
c++ - 为什么没有邀请订购 std::map 和订购 std::set 来制作 transaction_safe?
众所周知,Experimental C++ 中有事务内存 TS(ISO/IEC TS 19841:2015):将函数声明为 transaction_safe 就足够了,因此它们可以用于线程安全吗?
并operator[]
声明为transaction_safe
仅用于容器:std::vector
, std::unordered_map
, std::unordered_multimap
, std::unordered_set
, std::unordered_multiset
, std::deque
- 取自 n4514:http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4514.pdf
23.4 关联容器[associative]
23.4.4 类模板图[map]
23.4.4.1 类模板地图概述[map.overview]
在 23.4.4.1 [map.overview] 中,将“transaction_safe”添加到 begin 和 end 成员函数的所有变体的声明以及 size、max_size 和 empty 的声明中。
但是为什么没有operator[]
声明transaction_safe
为std::map
and std::set
(但有 for unordered_map
/ unordered_set
)?
为什么要在 and 的所有变体begin
和end
成员函数的声明std::map
中添加“transaction_safe” std::set
?
迭代器begin
和对于, orend
是非常必要的,但对于关联数组则不是。在关联数组中需要查找或查找并修改函数:、、和。没有他们,这是没有意义的。std::array
std::vector
std::list
find
at
insert
erase
operator[]
为什么没有邀请订购 std::map 和订购 std::set 来制作 transaction_safe?
c++ - 在 g++ 中构建事务性内存 C++ 代码
cppreference 网站有一个描述事务性内存 c++ 代码的(正在进行的工作)页面。这是页面上的第一个示例
在该页面的底部,有迹象表明这是建立在 gcc ( // GCC assembly with the attribute:
) 之上的。
我无法在 g++ 5.3.1 上构建它:
gcc 文档确实有一个关于 transactional memory 的页面,但是原语是不同的(例如,原子块是__transaction_atomic
)。相反,cppreference.com 上的页面似乎与N3919相关,并使用那里的原语。
如何使用 g++ 构建此代码?
c++ - 对软件事务内存友好的通用组件
假设我们编写了一些可以同时使用或不使用的新类。显然,我们不希望锁定所有内容,因为它们可能会被同时调用。解决此问题的一种方法是通过指定锁定的mixins进行参数化:
并Locking
使用实际上为多线程情况锁定的类和对另一种情况不执行任何操作的类进行实例化(希望编译器甚至会优化调用)。
现在假设我想用软件事务内存而不是锁定来做到这一点。查看N3919(或gcc 前体),想法不同。没有电话,例如
取而代之的是函数说明符,例如
和块说明符,如
后者调用前者的严格规则,并且看起来没有任何东西可以被mixins使用。
如何做到这一点(不涉及预处理器)?另请注意,STM 的主要优点之一是可组合性,但似乎没有办法让实例化来反映它bar
是可交易的。
c++ - 标准 C++ 事务内存状态
C++17 的事务性内存提案的当前状态是什么。它会被包含在标准中,旨在包含在标准 C++ 的某些未来版本中,还是只是一个实验性的概念验证功能,其标准化状态仍未确定?
我之所以问,是因为标准化委员会的一些文件似乎在这里给出了相互矛盾的沟通。一方面我们有 P0265R0 ( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0265r0.pdf ) 说事务内存不会被标准化,另一方面手 - Stroustrup ( http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4492.pdf ) 有一篇 N4492 论文,其中 C++17 功能列表中列出了事务内存。
c++ - 为什么使用 GCC 7、libstdc++ 和 -fgnu-tm 编译时 std::is_function 无法识别 transaction_safe 函数?
下面的编译失败是由于 libstdc++ 缺陷,还是这种行为符合事务性内存 TS ( n4514 )?
concurrency - 与参与者模型和锁相比,什么是事务内存
与基于actor和基于锁的同步相比,事务内存是多少?
据我了解,这是另一种并发控制机制。或者它与演员、事件、锁等完全不同?
c++ - HTM 中的 _xabort(status) 是如何工作的?
我_xabort(status)
在代码中使用了函数,以便释放缓存中的缓冲区。我检查交易是否成功,如果交易成功,我使用_xend()
,否则我使用_xabort(status)
。我可以_xabort(status)
在这种情况下使用吗?
我可以这样使用_xabort(status)
吗?这是单线程情况,我transaction_func()
自己检查,然后调用_xabort(status)
. 我认为这是关于使用的问题_xabort(status)
,我不知道它是否可以保留在(status == _XBEGIN_STARTED)
区域中。在我看来,如果 status 等于_XBEGIN_STARTED
,它不会中止交易,所以这段代码不对吗?
如果transction_func()
返回false,printf
在status
这段代码中,为什么状态值为'0xff000001'?
c++ - C++ 中的新功能“同步”块有什么优势?
有一个新的实验特性(可能是 C++20),它是“同步块”。该块提供了对一段代码的全局锁定。以下是来自cppreference的示例。
我觉得是多余的。上面的同步块和这个块之间有什么区别:
我在这里发现的唯一优点是我省去了拥有全局锁的麻烦。使用同步块有更多优点吗?什么时候应该首选?