相关疑难解决方法(0)

令人信服的自定义C++分配器示例?

有什么理由放弃std::allocator支持自定义解决方案?您是否遇到过正确性,性能,可扩展性等绝对必要的情况?有什么非常聪明的例子吗?

自定义分配器一直是我不太需要的标准库的一个功能.我只是想知道SO上的任何人是否可以提供一些令人信服的例子来证明他们的存在.

c++ memory-management std memory-alignment allocator

166
推荐指数
13
解决办法
9万
查看次数

Linux和gcc 4中的C++ new运算符线程安全性

不久,我将开始使用共享内存开发并行版本的网格细化算法.

该大学的一位教授指出,我们必须非常小心线程安全,因为编译器和stl都不是线程感知的.

我搜索了这个问题,答案取决于编译器(有些尝试有点线程感知)和平台(如果编译器使用的系统调用是否是线程安全的).

那么,在linux中,gcc 4编译器为new运算符生成线程安全的代码?

如果没有,解决这个问题的最佳方法是什么?也许锁定每个呼叫到新的运营商?

c++ linux gcc thread-safety

14
推荐指数
2
解决办法
1万
查看次数

堆上的多线程(de)分配

我有一个非常大的~30M对象,每个大约80字节 - 对于那些跟随的人来说是~2.2GB - 存储在磁盘上.每个对象的实际大小略有不同,因为每个对象都有一个QMap<quint32, QVariant>孩子.

从原始数据中解压缩这些对象是很昂贵的,所以我实现了一个多线程读取操作,它顺序从磁盘中提取几MB ,然后将每个原始数据块传递给一个线程,以便通过并行解压缩QtConcurrent.我的对象new在工作线程内的堆上创建(via ),然后传递回主线程以进行下一步.完成后,将在主线程上删除这些对象.

在单线程环境中,这种释放相对较快(约4-5秒).但是,当在4个线程上进行多线程处理时,这种释放速度非常慢(约26-36秒).使用Very Sleepy进行分析表明减速是在MSVCR100中free,因此释放本身就很慢.

搜索SO表明在不同线程上分配和解除分配是安全的.减速的来源是什么,我该怎么办呢?

编辑:一些示例代码传达了正在发生的事情: 为了排除故障,我已经从这个示例中完全删除了磁盘IO,只需创建对象然后删除它们.

class MyObject
{
public:
    MyObject() { /* set defaults... irrelevant here */}
    ~MyObject() {}
    QMap<quint32, QVariant> map;
    //...other members
}

//...

QList<MyObject*> results;

/* set up the mapped lambda functor (QtConcurrent reqs std::function if returning) */
std::function<QList<MyObject*>(quint64 chunksize)>
        importMap = [](quint64 chunksize) -> QList<MyObject*>
{
    QList<MyObject*> objs;
    for(int i = 0; i < chunksize; …
Run Code Online (Sandbox Code Playgroud)

c++ qt multithreading memory-management

6
推荐指数
2
解决办法
836
查看次数