Достаточно просто объявить все функции как 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(); }
?
Составной оператор в атомарном блоке не может быть выполнен
любое выражение или утверждение или вызвать любую функцию, которая не
transaction_safe
std::map<int, int>::operator[]
не будет transaction_safe
метод, поэтому вы не можете вызвать его в atomic_cancel. Это будет ошибка времени компиляции.
Других решений пока нет …