Достаточно ли объявить функцию как action_safe, чтобы их можно было использовать поточно-ориентированно?

Достаточно просто объявить все функции как transaction_safe в некоторых мой класс, так что его можно использовать как потокобезопасный в транзакциях atomic_noexcept, atomic_cancel, atomic_commit из экспериментальной транзакционной памяти TS?

Как известно, в стандартных библиотеках 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;
}

К сожалению, я не могу воспроизвести пример с atomic_cancel {} даже с ключом -fgnu-tm на GCC 6.1: https://godbolt.org/g/UcV4wI

И достаточно будет просто объявить все функции как transaction_safe в некоторых моих классах, так что его можно использовать как потокобезопасный - если я назову его в области видимости: atomic_cancel { obj.func(); }?

1 ответ

Решение

Составной оператор в атомарном блоке не имеет права выполнять любое выражение или оператор или вызывать любую функцию, которая не транзакция

std::map<int, int>::operator[] не будет transaction_safe метод, поэтому вы не можете вызвать его в atomic_cancel. Это будет ошибка времени компиляции.

Другие вопросы по тегам