提交 187d5579 编写于 作者: H HexToString

fix deadlock

上级 a07271e2
...@@ -383,6 +383,11 @@ int VersionedInferEngine::task_infer_impl(const void* in, ...@@ -383,6 +383,11 @@ int VersionedInferEngine::task_infer_impl(const void* in,
return -1; return -1;
} }
int InferManager::set_taskexecutor_num(size_t total_engine_num) {
im::bsf::TaskExecutorVector<TaskT>::instance().resize(total_engine_num);
return 0;
}
int InferManager::proc_initialize(const char* path, int InferManager::proc_initialize(const char* path,
const char* file, const char* file,
std::shared_ptr<int> engine_index_ptr) { std::shared_ptr<int> engine_index_ptr) {
...@@ -392,8 +397,6 @@ int InferManager::proc_initialize(const char* path, ...@@ -392,8 +397,6 @@ int InferManager::proc_initialize(const char* path,
return -1; return -1;
} }
uint32_t engine_num = model_toolkit_conf.engines_size(); uint32_t engine_num = model_toolkit_conf.engines_size();
im::bsf::TaskExecutorVector<TaskT>::instance().resize(*engine_index_ptr +
engine_num);
for (uint32_t ei = 0; ei < engine_num; ++ei) { for (uint32_t ei = 0; ei < engine_num; ++ei) {
LOG(INFO) << "model_toolkit_conf.engines(" << ei LOG(INFO) << "model_toolkit_conf.engines(" << ei
<< ").name: " << model_toolkit_conf.engines(ei).name(); << ").name: " << model_toolkit_conf.engines(ei).name();
......
...@@ -602,6 +602,8 @@ class InferManager { ...@@ -602,6 +602,8 @@ class InferManager {
const char* file, const char* file,
std::shared_ptr<int> engine_index_ptr); std::shared_ptr<int> engine_index_ptr);
int set_taskexecutor_num(size_t total_engine_num);
int thrd_initialize(); int thrd_initialize();
int thrd_clear(); int thrd_clear();
......
...@@ -135,6 +135,17 @@ int Resource::initialize(const std::string& path, const std::string& file) { ...@@ -135,6 +135,17 @@ int Resource::initialize(const std::string& path, const std::string& file) {
if (FLAGS_enable_model_toolkit) { if (FLAGS_enable_model_toolkit) {
size_t model_toolkit_num = resource_conf.model_toolkit_path_size(); size_t model_toolkit_num = resource_conf.model_toolkit_path_size();
// 此处暂时认为,每个model_toolkit仅包含一个engine
// 故认为 model_toolkit_num == engine总数
// 若以后出现model_toolkit仅包含多个engine
// 则应先for循环统计engine总数,再set_taskexecutor_num
// 切不可动态im::bsf::TaskExecutorVector<TaskT>::instance().resize
// TaskExecutor是线程池,内含锁,在engine进程初始化时已开始work加锁循环运行了
// 之后再resize内存搬运,会导致work使用原锁,而搬运后的TaskExecutor的锁内存已改变
if (InferManager::instance().set_taskexecutor_num(model_toolkit_num) != 0) {
LOG(ERROR) << "failed set_taskexecutor_num";
return -1;
}
std::shared_ptr<int> engine_index_ptr(new int(0)); std::shared_ptr<int> engine_index_ptr(new int(0));
for (size_t mi = 0; mi < model_toolkit_num; ++mi) { for (size_t mi = 0; mi < model_toolkit_num; ++mi) {
std::string model_toolkit_path = resource_conf.model_toolkit_path(mi); std::string model_toolkit_path = resource_conf.model_toolkit_path(mi);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册