将函数声明为transaction_safe是否足够,因此可以使用线程安全的?

时间:2016-07-29 16:20:22

标签: c++ concurrency c++14 transactional-memory

只是在我的某个类中将所有函数声明为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(); }

1 个答案:

答案 0 :(得分:1)

  

不允许执行原子块中的复合语句   任何表达或陈述或调用任何不是的函数   transaction_safe

std::map<int, int>::operator[]不会是transaction_safe方法,因此您无法在atomic_cancel中调用它。这将是一个编译时错误。