LINUX.ORG.RU

Lock-free структуры и динамическое создание.

 , ,


0

2

Всем привет.

Наткнулся на эту статью https://habr.com/post/328374/ и решил немного поэкспериментировать...

Сразу хочу сказать, что мои знания в C++ не слишком глубокие, и в некоторые вещи как-то все не получается въехать... ((

Есть такая задача, создавать и удалять «на лету» look-free структуры. (все это хотелки и идеальный вариант).

Хочется с помощью описаного метода сделать такую вещь:

sf::contfree_safe_ptr<std::map < long, string> > *map;

map = new sf::contfree_safe_ptr<std::map < long, string> >;
но оно отказывается собираться, собирается только если
sf::contfree_safe_ptr<std::map < long, string> > map;

Это можно как-то «исправить» или это нужно все переделывать?

P.S. Сори если задаю глупые вопросы, ну очень захотелось такое и именно так использовать.

Спасибо.


Ответ на: комментарий от anonymous
===> Verifying dependencies...
===> Compiling ldn_map
make: вход в каталог «/home/denis/Projects/ldn_map/c_src»
g++ -O3 -finline-functions -Wall -fPIC -I /home/denis/bin/erlang/erts-9.3/include/ -I /home/denis/bin/erlang/lib/erl_interface-3.10.2/include -I . -std=c++14 -g -Wextra -Werror -Wno-missing-field-initializers -fno-rtti -fno-exceptions
 CPP    ldn_map.cc
/home/denis/Projects/ldn_map/c_src/ldn_map.cc: In function ‘ERL_NIF_TERM nif_ldn_map_insert(ErlNifEnv*, int, const ERL_NIF_TERM*)’:
/home/denis/Projects/ldn_map/c_src/ldn_map.cc:65:16: error: ‘sf::contfree_safe_ptr<std::map<long int, field_t> > {aka class sf::safe_ptr<std::map<long int, field_t>, sf::contention_free_shared_mutex<>, std::unique_lock<sf::contention_free_shared_mutex<> >, sf::shared_lock_guard<sf::contention_free_shared_mutex<> > >}’ has no member named ‘emplace’
     inst->map->emplace(index, (field_t(d)));
                ^~~~~~~
In file included from /home/denis/Projects/ldn_map/c_src/ldn_map.cc:8:0:
/home/denis/Projects/ldn_map/c_src/safe_ptr.h: In instantiation of ‘sf::contention_free_shared_mutex<contention_free_count, shared_flag>::contention_free_shared_mutex() [with unsigned int contention_free_count = 36; bool shared_flag = false]’:
/usr/include/c++/7/ext/new_allocator.h:136:4:   required from ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = sf::contention_free_shared_mutex<>; _Args = {}; _Tp = sf::contention_free_shared_mutex<>]’
/usr/include/c++/7/bits/alloc_traits.h:475:4:   required from ‘static void std::allocator_traits<std::allocator<_CharT> >::construct(std::allocator_traits<std::allocator<_CharT> >::allocator_type&, _Up*, _Args&& ...) [with _Up = sf::contention_free_shared_mutex<>; _Args = {}; _Tp = sf::contention_free_shared_mutex<>; std::allocator_traits<std::allocator<_CharT> >::allocator_type = std::allocator<sf::contention_free_shared_mutex<> >]’
/usr/include/c++/7/bits/shared_ptr_base.h:1327:23:   required from ‘std::__shared_ptr<_Tp, _Lp>::__shared_ptr(std::_Sp_make_shared_tag, const _Alloc&, _Args&& ...) [with _Alloc = std::allocator<sf::contention_free_shared_mutex<> >; _Args = {}; _Tp = sf::contention_free_shared_mutex<>; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2]’
/usr/include/c++/7/bits/shared_ptr.h:344:64:   required from ‘std::shared_ptr<_Tp>::shared_ptr(std::_Sp_make_shared_tag, const _Alloc&, _Args&& ...) [with _Alloc = std::allocator<sf::contention_free_shared_mutex<> >; _Args = {}; _Tp = sf::contention_free_shared_mutex<>]’
/usr/include/c++/7/bits/shared_ptr.h:690:14:   required from ‘std::shared_ptr<_Tp> std::allocate_shared(const _Alloc&, _Args&& ...) [with _Tp = sf::contention_free_shared_mutex<>; _Alloc = std::allocator<sf::contention_free_shared_mutex<> >; _Args = {}]’
/usr/include/c++/7/bits/shared_ptr.h:706:39:   required from ‘std::shared_ptr<_Tp> std::make_shared(_Args&& ...) [with _Tp = sf::contention_free_shared_mutex<>; _Args = {}]’
/home/denis/Projects/ldn_map/c_src/safe_ptr.h:87:106:   required from ‘sf::safe_ptr<T, mutex_t, x_lock_t, s_lock_t>::safe_ptr(Args ...) [with Args = {}; T = std::map<long int, field_t>; mutex_t = sf::contention_free_shared_mutex<>; x_lock_t = std::unique_lock<sf::contention_free_shared_mutex<> >; s_lock_t = sf::shared_lock_guard<sf::contention_free_shared_mutex<> >]’
/home/denis/Projects/ldn_map/c_src/ldn_map.cc:40:26:   required from here
/home/denis/Projects/ldn_map/c_src/safe_ptr.h:355:24: error: ‘sf::contention_free_shared_mutex<>::shared_locks_array’ will be initialized after [-Werror=reorder]
         array_slock_t &shared_locks_array;
                        ^~~~~~~~~~~~~~~~~~
/home/denis/Projects/ldn_map/c_src/safe_ptr.h:347:21: error:   ‘std::atomic<bool> sf::contention_free_shared_mutex<>::want_x_lock’ [-Werror=reorder]
   std::atomic<bool> want_x_lock;
                     ^~~~~~~~~~~
/home/denis/Projects/ldn_map/c_src/safe_ptr.h:437:13: error:   when initialized here [-Werror=reorder]
             contention_free_shared_mutex() :
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors
nif.mk:80: recipe for target '/home/denis/Projects/ldn_map/c_src/ldn_map.o' failed
make: *** [/home/denis/Projects/ldn_map/c_src/ldn_map.o] Error 1
make: выход из каталога «/home/denis/Projects/ldn_map/c_src»
===> Hook for compile failed!

denisE
() автор топика
Ответ на: комментарий от denisE

Я бы посоветовал Вам или отложить Си++ и взять что попроще, Perl там, например, или для начала научиться писать на Си++ хотя бы компилирующиеся хелловорлды.

Virtuos86 ★★★★★
()
Ответ на: комментарий от denisE

Да, всё можно исправить.

Не знаю почему не видит emplace, возможно не указан стандарт? попробуй добавить в флаги компиляции -std=c++11

По поводу -Werror=reorder, то это легко. Нужно лишь инициализировать переменные в том порядке в конструкторе, в котором они перечислены в классе.

То есть заменить такие строчки

	contention_free_shared_mutex() :
		shared_locks_array_ptr(std::make_shared<array_slock_t>()), shared_locks_array(*shared_locks_array_ptr), want_x_lock(false), recursive_xlock_count(0),
		owner_thread_id(thread_id_t()) {}
на такие
	contention_free_shared_mutex() :
		want_x_lock(false), shared_locks_array_ptr(std::make_shared<array_slock_t>()), shared_locks_array(*shared_locks_array_ptr), recursive_xlock_count(0),
		owner_thread_id(thread_id_t()) {}

Код с habr у меня собрался, если использовать указатели...

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

За правку - спасибо. Все собралось без варнингов.
А по поводу сборки, тоже все собралось. Оказалось что у меня неправильно вызывался

// было
inst->map->emplace(index, (field_t(d)));
// стало
inst->map->operator->().operator->()->emplace(index, (field_t(d)));

Всем спасибо.

denisE
() автор топика
Последнее исправление: denisE (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

Самое страшное когда человек начинает лепить «умень» ни сказав «по делу» ничего.
Вообще Ничего, Карл!!!!
И когда ему об этом говорят, намекая, что такое писать как минимум глупо, то человек впадает ещё в большее хамство: «помечая как дурачок».
Мальчик(или девочка, не важно), нужно срочно взрослеть.

denisE
() автор топика
Последнее исправление: denisE (всего исправлений: 1)
Ответ на: комментарий от anonymous

Пишу на понятном вам языке.
А что делать?...

denisE
() автор топика
Ответ на: комментарий от anonymous

Ты читал какой-то другой тред? ТС радостно принес сюда то, что ему не по силёнкам, а когда ему на это указали, решил сострить. Острит он так себе, но это дело десятое, если бы он разбирался в том коде, который хочет написать и пишет.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Уже и в C++ экспертом стал, не только в пистоне? Растешь.

bread
()
Ответ на: комментарий от Virtuos86

ТС радостно принес сюда то, что ему не по силёнкам

А куда ему нужно было обращаться за помощью? На Stackoverflow?

а когда ему на это указали, решил сострить.

Реакция здорового человека, которому вместо помощи в конкретном вопросе дурацкие советы дают. Да еще и те, кто на C++ вообще не программирует.

eao197 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.