“cc9a860d930c7e336128e1020d29a1d5219811b5”上不存在“develop/doc/howto/cluster/index_en.html”
DoubleBuffer::asyncLoader_ 未初始化
Created by: lernanto
DoubleBuffer::asyncLoader_ 成员变量由函数 DoubleBuffer::startAsyncLoad() (DataProvider.cpp:149) 赋初值。但在析构函数 DoubleBuffer::~DoubleBuffer() 中会调用 DoubleBuffer::finishAsyncLoad(),该函数又调用 DoubleBuffer::asyncLoader_->join() (DataProvider.h:273)。由于 DoubleBuffer::asyncLoader_ 不是随 DoubleBuffer 的构造函数初始化,析构时可能存在该成员变量未初始化的情况,此时会引发段错误。
该问题可能在 paddle test 时触发。具体地,在 Trainer::init() (Trainer.cpp:197) 通过 DataProvider::create() 创建了 DataProvider 对象,该对象的构造函数会创建 DoubleBuffer 对象。但后续并没有调用 DoubleBuffer::startAsyncLoad() 初始化。当程序结束时,连串析构函数最终会调用 DoubleBuffer::~DoubleBuffer(),从而调用 DoubleBuffer::finishAsyncLoad() 结束不存在的线程,导致崩溃。
paddle train 因为会调用 DataProvider::reset() (Trainer.cpp:273) 初始化 DoubleBuffer::asyncLoader_,因此没有这个问题。