1

仅仅像我的类中那样声明所有函数就足够了,所以它可以在实验事务内存 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 页:

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 上atomic_cancel {}使用密钥,我也无法重现示例: https ://godbolt.org/g/UcV4wI-fgnu-tm

并且足以像transaction_safe在我的某些类中那样声明所有函数,因此它可以用作线程安全的 - 如果我将在范围内调用它:atomic_cancel { obj.func(); }

4

1 回答 1

1

原子块中的复合语句不允许执行任何表达式或语句或调用任何非事务安全的函数

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

于 2016-07-29T16:31:18.817 回答