在C++中将(预定义的)原子值添加到矢量



我在C++中使用多线程时遇到了一个问题。

我有一个类(称之为class_a_example(,它在头文件中定义,带有公共和受保护的访问修饰符。class_a_example取决于几个变量/结构。

在"受保护"中,我定义了m_accessed成员 - 向量由原子组成,当创建类元素时,它还取决于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交互(需要更改原子值(:

// 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::atomic(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.hclass_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));

有没有办法(最好是简单的(创建预定义的原子向量或向其添加值?

std::atomic 没有复制构造函数。

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

而不是

m_accessed.emplace_back(std::atomic<uint32_t>(0));

我找到了一个解决方案来定义具有我想使用的值的原子向量。它解决了问题

// 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
}
};

完成此操作后,将成功创建原子向量并使用所需的值进行定义。

最新更新