只是在我的某个类中将所有函数声明为transaction_safe
,所以它可以在实验事务内存TS的事务atomic_noexcept, atomic_cancel, atomic_commit
中用作线程安全的吗?
众所周知,实验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页:
23.4 Associative containers [associative]
23.4.4 Class template map [map]
23.4.4.1 Class template map overview [map.overview]
In 23.4.4.1 [map.overview], add "transaction_safe" to the declarations of all
variants of the begin and end member functions and to
the declarations of size, max_size, and empty.
即。如果Transactional Memory将提交给C ++标准,那么我们可以简单地做这样的事情吗?它会线程安全吗?
#include<map>
#include<thread>
std::map<int, int> m;
int main() {
std::thread t1([&m]() {
atomic_cancel
{
m[1] = 1; // thread-safe
}
} );
t1.join();
return 0;
}
不幸的是,即使在GCC 6.1上使用密钥atomic_cancel {}
,我也无法使用-fgnu-tm
重现示例:https://godbolt.org/g/UcV4wI
并且足以在我的某个类中将所有函数声明为transaction_safe
,因此它可以用作线程安全的 - 如果我将在范围内调用它:atomic_cancel { obj.func(); }
?
答案 0 :(得分:1)
不允许执行原子块中的复合语句 任何表达或陈述或调用任何不是的函数 transaction_safe
std::map<int, int>::operator[]
不会是transaction_safe
方法,因此您无法在atomic_cancel中调用它。这将是一个编译时错误。