将一个函数声明为 transaction_safe 是否足够,以便它们可以线程安全地使用?
Is it enough to declare a function as transaction_safe, so they can be used thread-safe?
在我的 class 中将所有函数声明为 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.
即如果事务内存将提交给 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 上使用密钥 -fgnu-tm
,我也无法使用 atomic_cancel {}
重现示例:https://godbolt.org/g/UcV4wI
并且只需在我的 class 中将所有函数声明为 transaction_safe
就足够了,因此它可以用作线程安全的 - 如果我将在范围内调用它:atomic_cancel { obj.func(); }
?
The compound-statement in an atomic block is not allowed to execute
any expression or statement or call any function that isn't
transaction_safe
std::map<int, int>::operator[]
不会是 transaction_safe
方法,因此您不能在 atomic_cancel 中调用它。这将是一个编译时错误。
在我的 class 中将所有函数声明为 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.
即如果事务内存将提交给 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 上使用密钥 -fgnu-tm
,我也无法使用 atomic_cancel {}
重现示例:https://godbolt.org/g/UcV4wI
并且只需在我的 class 中将所有函数声明为 transaction_safe
就足够了,因此它可以用作线程安全的 - 如果我将在范围内调用它:atomic_cancel { obj.func(); }
?
The compound-statement in an atomic block is not allowed to execute any expression or statement or call any function that isn't transaction_safe
std::map<int, int>::operator[]
不会是 transaction_safe
方法,因此您不能在 atomic_cancel 中调用它。这将是一个编译时错误。