gpt4 book ai didi

c++ - concurrent_queue 的内存损坏

转载 作者:太空宇宙 更新时间:2023-11-04 14:19:40 26 4
gpt4 key购买 nike

我的并发系统中存在内存损坏问题。

我有一个不是线程安全的内存分配器,我正试图通过按需向各种线程提供多个实例来使其成为线程安全的。此代码显示了我正在使用的系统。它有效地构建了一个实例队列。如果队列为空,则创建一个新实例,否则从队列中取出一个。当线程处理完实例后,它会将实例推回队列以供稍后再次使用。

Concurrency::concurrent_queue<std::shared_ptr<Memory::Arena>> result_memory_arenas;
//std::
struct ConcurrentMemoryArena {
Context* ptr;
std::shared_ptr<Memory::Arena> arena;
Memory::Arena& operator*() { return *arena; }
Memory::Arena* operator->() { return arena.get(); }
~ConcurrentMemoryArena() {
if (arena)
ptr->result_memory_arenas.push(arena);
}
ConcurrentMemoryArena(Context* owner)
: ptr(owner) {}
ConcurrentMemoryArena(ConcurrentMemoryArena&& other) {
arena = std::move(other.arena);
other.arena = nullptr;
ptr = other.ptr;
}
};
ConcurrentMemoryArena ConcurrentGetResultArena() {
ConcurrentMemoryArena ret(this);
/*if (!result_memory_arenas.empty()) {
ret.arena = result_memory_arenas.front();
result_memory_arenas.pop();
return ret;
}*/
if (result_memory_arenas.try_pop(ret.arena)) {
return ret;
}
ret.arena = std::make_shared<Memory::Arena>();
return std::move(ret);
}

我的使用代码相当小。

Concurrency::concurrent_vector<Wide::Parser::NamespaceAST*> ASTs;
Concurrency::parallel_for_each(filenames.begin(), filenames.end(), [&](String* ptr) {
auto arena = ConcurrentGetResultArena();
ASTs.push_back(parser(lexer(ptr, *arena), *arena));
});

lexerparser 都是“纯”函数,在任何情况下都不是并发的,也不是共享状态的。

系统工作正常,但是当这个函数完成时,内存被破坏了,我的意思是整个对象包含result_memory_arenas,当队列销毁时,它会尝试销毁shared_ptr 具有无效指针,导致崩溃。但我看不出问题出在哪里。我使用了预先提供的并发容器,shared_ptr 是线程安全的,真正并行调用的函数是纯函数。

编辑:其他对象都死了,因为有趣的是,队列实际上是最后一个被销毁的对象。我在添加到队列时中断了,它们都是有效的 shared_ptr。函数完成后,它们都是有效的 shared_ptr。那么为什么在销毁队列时会销毁一个半身像shared_ptr

再次编辑:我将其追溯到实现中的一个未初始化的内存错误,这并没有让我感到非常惊讶。令人惊讶的是,这些东西通过了非 POD 类的任何类型的测试。

最佳答案

再次将此追踪到一个实现错误。微软应该雇用我作为测试员。

关于c++ - concurrent_queue 的内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8624428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com