相关疑难解决方法(0)

我可以创建一个线程安全的std :: atomic <vector <int >>吗?

我有一个需要执行的功能n=1000.此函数执行蒙特卡罗样式模拟并返回int结果.我想nthreads=4和平奔跑.每当一个线程完成一个循环时,它应该将结果放入a std::vector<int>.因此,在1000个循环后,我有一个1000 ints 的向量,可以通过统计检查.

由于a std::vector不是线程安全的,我想std::mutex(这肯定会起作用).

但我想知道我是否可以声明一个矢量是原子的,从而绕过互斥体?有没有可能std::atomic<std::vector<int>>?我可以使用push_back等吗?

c++ multithreading vector c++11

18
推荐指数
3
解决办法
1万
查看次数

为什么g ++仍然需要-latomic

29.5原型类型的C++标准2014年11月的工作草案中,它指出:

  1. 有一个泛型类模板atomic.模板参数T的类型应该是可以轻易复制的(3.9).[注意:不能静态初始化的类型参数可能难以使用. - 尾注]

所以 - 据我所知 - 这:

#include <atomic>

struct Message {
    unsigned long int a;
    unsigned long int b;
};

std::atomic<Message> sharedState;

int main() {    
    Message tmp{1,2};       
    sharedState.store(tmp);         
    Message tmp2=sharedState.load();
}
Run Code Online (Sandbox Code Playgroud)

应该是完全有效的标准c ++ 14(以及c ++ 11)代码.但是,如果我没有libatomic手动链接,那么命令

g++ -std=c++14 <filename>
Run Code Online (Sandbox Code Playgroud)

给出 - 至少在Fedora 22(gcc 5.1)上 - 以下链接错误:

/tmp/ccdiWWQi.o: In function `std::atomic<Message>::store(Message, std::memory_order)':
main.cpp:(.text._ZNSt6atomicI7MessageE5storeES0_St12memory_order[_ZNSt6atomicI7MessageE5storeES0_St12memory_order]+0x3f): undefined reference to `__atomic_store_16'
/tmp/ccdiWWQi.o: In function `std::atomic<Message>::load(std::memory_order) const':
main.cpp:(.text._ZNKSt6atomicI7MessageE4loadESt12memory_order[_ZNKSt6atomicI7MessageE4loadESt12memory_order]+0x1c): undefined reference to `__atomic_load_16'
collect2: error: ld returned 1 exit status …
Run Code Online (Sandbox Code Playgroud)

c++ g++ libstdc++ c++11 stdatomic

12
推荐指数
1
解决办法
3658
查看次数

std :: atomic library dependency(gcc 4.7.3)

我一直在尝试使用std :: atomic进行编译,并且我得到了对__atomic_load,__ atomic_store和__atomic_store_16的未解析引用.

我知道在更高版本的gcc(4.8+?)中你包括-latomic,但是我用gcc编译4.7.3; 我已经尝试添加-latomic_ops和-latomic_ops_gpl,但似乎都没有做太多.

我现在正在安装gcc 4.8.1,但我确实有一个真正需要为4.7.3编译的发布平台.

非常感谢.

编辑:好的,这里有一些导致我遇到问题的代码:

atomics.cpp
#include <atomic>
#include <stdint.h>

struct dataStruct {
    int a;
    uint16_t b;
    float c;
    dataStruct(int ai, uint16_t bi, float ci)  noexcept : a(ai), b(bi), c(ci) {
    }
    dataStruct() noexcept : dataStruct(0,0,0) {
    }
};

int main() {
    std::atomic<dataStruct> atomicValue;

    atomicValue = dataStruct(10, 0, 0);

    return atomicValue.load().b;
}
Run Code Online (Sandbox Code Playgroud)

使用"g ++ - 4.8.1*.cpp -std = c ++ 0x -latomic",这个编译很好.

使用"g ++ - 4.7.3*.cpp -std = c ++ 0x -pthread -lpthread -latomic_ops",它失败并显示以下内容:

/tmp/ccQp8MJ2.o: …
Run Code Online (Sandbox Code Playgroud)

c++ gcc shared-libraries c++11

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