Добавить (предопределенные) значения atomi c к вектору в C ++ - PullRequest
0 голосов
/ 26 января 2020

Я столкнулся с проблемой при работе с многопоточностью в 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 вектор или добавить к нему значения?

Ответы [ 2 ]

1 голос
/ 26 января 2020

std :: atomi c не имеет конструктора копирования.

Используйте

m_accessed.emplace_back();
m_accessed.back().store(0);

Вместо

m_accessed.emplace_back(std::atomic<uint32_t>(0));
0 голосов
/ 28 января 2020

Я нашел РЕШЕНИЕ, чтобы определить атоми c вектор со значениями, которые я хочу использовать. Это решило проблему

// class_a_example_header.h

class class_a_example {
protected:
    std::vector<std::atomic<uint32_t>> m_accessed;
    // 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)
    {
        for (auto it = m_accessed.begin(); it != m_accessed.end(); it++)
            std::atomic_init(&*it, 0u) //instead of 0u specify value you want to be in atomic
    }
};

После этого действия атоми c вектор будут успешно созданы и определены с нужными значениями.

...