相关疑难解决方法(0)

线程安全的无锁阵列

我有一个C++库,它应该在多个线程上进行一些计算.我创建了独立的线程代码(即它们之间没有共享变量),除了一个数组.问题是,我不知道如何使其成为线程安全的.

我看了互斥锁/解锁(QMutex因为我正在使用Qt),但它不适合我的任务 - 而一个线程将锁定互斥锁,其他线程将等待!

然后我读到了std::atomic,看起来就像我需要的那样.不过,我尝试以下列方式使用它:

std::vector<std::atomic<uint64_t>> *myVector;
Run Code Online (Sandbox Code Playgroud)

并且它产生了编译器错误(使用已删除的函数'std :: atomic :: atomic(const std :: atomic&)').然后我找到了解决方案 - 使用特殊的包装器std::atomic.我试过这个:

struct AtomicUInt64
{
    std::atomic<uint64_t> atomic;

    AtomicUInt64() : atomic() {}

    AtomicUInt64 ( std::atomic<uint64_t> a ) : atomic ( atomic.load() ) {}

    AtomicUInt64 ( AtomicUInt64 &auint64 ) : atomic ( auint64.atomic.load() ) {}

    AtomicUInt64 &operator= ( AtomicUInt64 &auint64 )
    {
                atomic.store ( auint64.atomic.load() );
    }
};

std::vector<AtomicUInt64> *myVector;
Run Code Online (Sandbox Code Playgroud)

这个东西成功编译,但是当我无法填充向量时:

myVector = new std::vector<AtomicUInt64>();

for ( int …
Run Code Online (Sandbox Code Playgroud)

c++ arrays thread-safety

8
推荐指数
1
解决办法
6277
查看次数

调整原子矢量的大小?

如何调整原子矢量的大小?

例如,以下代码无法编译:

#include <iostream>
#include <vector>
#include <atomic>

int main()
{
    std::vector<std::atomic<int>> v;
    v.resize(1000); // Problem here!
    v[0] = 1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误:

In file included from /usr/local/gcc-4.8.1/include/c++/4.8.1/vector:62:0,
                 from main.cpp:2:
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_construct.h: In instantiation of ‘void std::_Construct(_T1*, _Args&& ...) [with _T1 = std::atomic<int>; _Args = {std::atomic<int>}]’:
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_uninitialized.h:75:53:   required from ‘static _ForwardIterator std::__uninitialized_copy<_TrivialValueTypes>::__uninit_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = std::move_iterator<std::atomic<int>*>; _ForwardIterator = std::atomic<int>*; bool _TrivialValueTypes = false]’
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_uninitialized.h:117:41:   required from ‘_ForwardIterator std::uninitialized_copy(_InputIterator, _InputIterator, _ForwardIterator) [with _InputIterator = std::move_iterator<std::atomic<int>*>; _ForwardIterator = std::atomic<int>*]’
/usr/local/gcc-4.8.1/include/c++/4.8.1/bits/stl_uninitialized.h:258:63: …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading vector atomic c++11

4
推荐指数
1
解决办法
2163
查看次数

标签 统计

c++ ×2

arrays ×1

atomic ×1

c++11 ×1

multithreading ×1

thread-safety ×1

vector ×1