Я столкнулся с проблемой при работе с многопоточностью в C ++.
У меня есть класс (назовите его class_a_example ), который определен в заголовочном файле с помощью publi c и модификаторов защищенного доступа. class_a_example зависит от нескольких переменных / структур.
В «защищенном» я определил m_accessed member - вектор состоит из атомов, и когда создается элемент класса , это также зависит от m_accessed , который должен иметь предопределенные значения в m_accessed. Вот так:
// class_a_example_header.h
class class_a_example {
protected:
std::vector<std::atomic<uint32_t>> m_accessed;
std::vector<uint32_t> m_vars;
std::mutex m_mtx;
// some other structures
public:
// some methods
inline class_a_example(/*params*/, size_t c_count, /*params*/) : m_vars(c_count, 0), m_accessed(c_count, std::atomic<uint32_t>(0))
{
/* some actions */
}
};
В class_a_example_header. cpp в одном методе class_a_example Мне нужно взаимодействовать с m_accessed (нужно изменить atomi c значения):
// class_a_example_header.cpp
int32_t class_a_example::change_values(uint32_t thread_index)
{
/* some actions */
m_accessed[thread_index]++;
/* some actions */
}
Но когда я компилирую свою программу, я получаю сообщение об ошибке (особенно в m_accessed (c_count, std :: atomi c (0)) ) :
inline class_a_example(/*params*/, size_t c_count, /*params*/) : m_vars(c_count, 0), m_accessed(c_count, std::atomic<uint32_t>(0))
Ошибка:
class_a_example.cpp:114:57: required from here
/opt/rh/devtoolset-8/root/usr/include/c++/8/ext/new_allocator.h:136:4: error: use of deleted function ‘std::atomic<unsigned int>::atomic(const std::atomic<unsigned int>&)’
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
После этого я переписал class_a_example.h и class_a_example. cpp:
// class_a_example_header.h
class class_a_example {
protected:
std::vector<std::atomic<uint32_t>> m_accessed;
// ...
public:
inline class_a_example(/*params*/, size_t c_count, /*params*/) : m_vars(c_count, 0), m_accessed()
{
// ...
}
// ...
};
// class_a_example_header.cpp
int32_t class_a_example::change_values(uint32_t thread_index)
{
/* some actions */
if (m_accessed.size() < m_vars.size())
m_accessed.emplace_back(std::atomic<uint32_t>(0));
m_accessed[thread_index]++;
/* some actions */
}
Но ошибка в целом та же самая, только она начинается здесь: m_accessed.emplace_back(std::atomic<uint32_t>(0));
Есть ли способ (желательно простой) для создания предопределенных атомов c вектор или добавить к нему значения?