diff --git a/FFNvDecoder/FFNvDecoderManager.cpp b/FFNvDecoder/FFNvDecoderManager.cpp index 5008f8c..af2e741 100644 --- a/FFNvDecoder/FFNvDecoderManager.cpp +++ b/FFNvDecoder/FFNvDecoderManager.cpp @@ -177,6 +177,7 @@ int FFNvDecoderManager::count() { closeAllFinishedDecoder(); + std::lock_guard l(m_mutex); return decoderMap.size(); } diff --git a/tsl_aiplatform/ai_platform/MultiSourceProcess.cpp b/tsl_aiplatform/ai_platform/MultiSourceProcess.cpp index 3b7fd91..42a5aaa 100644 --- a/tsl_aiplatform/ai_platform/MultiSourceProcess.cpp +++ b/tsl_aiplatform/ai_platform/MultiSourceProcess.cpp @@ -93,6 +93,7 @@ int CMultiSourceProcess::InitAlgorthim(tsl_aiplatform_param vptParam) { m_bfinish = false; + // 设置gpuid gpu_id_ = to_string(vptParam.gpuid); int ret = SUCCESS; @@ -113,12 +114,6 @@ int CMultiSourceProcess::InitAlgorthim(tsl_aiplatform_param vptParam) { { /*初始化全局参数*/ - mModeSnapshotVideo = "cpu"; - mModeSnapshotLittle = "cpu"; - - taskFinishCallbackFunc = nullptr; - taskObjInfoCallbackFunc = nullptr; - set_default_logger(LogLevel(vptParam.log_level), "multi_source_video_process", vptParam.log_path, vptParam.log_mem, vptParam.log_mem); @@ -327,35 +322,19 @@ bool CMultiSourceProcess::AddTask(task_param _cur_task_param){ #endif // 启动算法处理线程 - startProcessByGpuid(gpu_id_); + startProcessByGpuid(); } // 启动算法处理线程 -void CMultiSourceProcess::startProcessByGpuid(const string gpuid){ - - struct ThreadArg{ - const string gpu_id; - void* opaque; - }; - - ThreadArg thread_arg = {gpuid, this}; - - pthread_t* processThread = gpuProcessthreadMap[gpuid]; - if(processThread == nullptr){ - pthread_t* pTread = new pthread_t; - pthread_create(pTread,0, - [](void* arg) - { - ThreadArg* ptr=(ThreadArg*)arg; - if(ptr != nullptr){ - CMultiSourceProcess* process = (CMultiSourceProcess*)ptr->opaque ; - process->algorthim_process_thread(ptr->gpu_id); - } - return (void*)0; - } - ,&thread_arg); - gpuProcessthreadMap[gpuid] = pTread; - } +void CMultiSourceProcess::startProcessByGpuid(){ + pthread_create(&m_gpuProcessthread,0, + [](void* arg) + { + CMultiSourceProcess* process = (CMultiSourceProcess*)arg ; + process->algorthim_process_thread(); + return (void*)0; + } + ,this); } void CMultiSourceProcess::post_decode_thread(task_param _cur_task_param, AVFrame * gpuFrame){ @@ -378,7 +357,7 @@ void CMultiSourceProcess::post_decode_thread(task_param _cur_task_param, AVFrame } // TODO 本循环需要一个可以手动终止的开关 m_QueueMtx.lock(); - if(m_RgbDataList.size() >= (20 * gpuProcessthreadMap.size() + 20)){ + if(m_RgbDataList.size() >= 40){ m_QueueMtx.unlock(); std::this_thread::sleep_for(std::chrono::milliseconds(1)); continue; @@ -390,6 +369,7 @@ void CMultiSourceProcess::post_decode_thread(task_param _cur_task_param, AVFrame } } +// 解码线程退出的最后回调的实际任务函数 void CMultiSourceProcess::decode_finished_thread(task_param t_param){ // 任务结束,关闭跟踪 if (!FinishTaskTracker(VPT_Handle_, t_param.task_id)) @@ -436,7 +416,7 @@ void CMultiSourceProcess::cuda_free_wrap(sy_img &img) { } // 算法处理函数,由算法线程调用 -void CMultiSourceProcess::algorthim_process_thread(const string gpuid){ +void CMultiSourceProcess::algorthim_process_thread(){ map task_id_to_n_frame; while(true){ @@ -454,16 +434,12 @@ void CMultiSourceProcess::algorthim_process_thread(const string gpuid){ m_QueueMtx.lock(); vector vec_gpuMem; - for (auto iter = m_RgbDataList.begin(); iter!=m_RgbDataList.end(); ){ + for (auto iter = m_RgbDataList.begin(); iter!=m_RgbDataList.end(); ++ iter){ GpuRgbMemory* gpuMem = *iter; - if(gpuMem->getGpuId() == gpuid){ - vec_gpuMem.push_back(gpuMem); - iter = m_RgbDataList.erase(iter); - if(vec_gpuMem.size() >= 20){ - break; - } - } else { - ++ iter; + vec_gpuMem.push_back(gpuMem); + iter = m_RgbDataList.erase(iter); + if(vec_gpuMem.size() >= 20){ + break; } } @@ -1171,7 +1147,6 @@ int CMultiSourceProcess::GetTaskStatus(const string taskID) { if (!taskids.empty()) { auto json_str = helpers::gen_json::gen_task_status_json(taskids, statues); - // mq_manager_->publish(mq_type_t::GET_TASK_MQ, json_str.c_str()); mq_manager_->publish(mq_type_t::GET_TASK_MQ, json_str.c_str(),true); } @@ -1226,13 +1201,7 @@ void CMultiSourceProcess::CloseAllTask(){ FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance(); pDecManager->closeAllDecoder(); - for (auto it = gpuProcessthreadMap.begin(); it != gpuProcessthreadMap.end(); it++){ - if(it->second != 0){ - pthread_join(*(it->second),0); - delete it->second; - } - } - gpuProcessthreadMap.clear(); + pthread_join(m_gpuProcessthread,0); m_QueueMtx.lock(); for (auto iter = m_RgbDataList.begin(); iter!=m_RgbDataList.end(); ){ diff --git a/tsl_aiplatform/ai_platform/MultiSourceProcess.h b/tsl_aiplatform/ai_platform/MultiSourceProcess.h index a590738..f3f0bb1 100644 --- a/tsl_aiplatform/ai_platform/MultiSourceProcess.h +++ b/tsl_aiplatform/ai_platform/MultiSourceProcess.h @@ -155,7 +155,7 @@ public: public: // 生成线程的内部接口,外部勿调用 - void algorthim_process_thread(const string gpuid); // 算法处理线程 + void algorthim_process_thread(); // 算法处理线程 void post_decode_thread(task_param _cur_task_param, AVFrame * gpuFrame); // 解码数据处理函数,在解码线程中执行 void decode_finished_thread(task_param _cur_task_param); // 解码线程结束后处理函数,在解码线程中执行 @@ -164,7 +164,7 @@ public: #endif private: - void startProcessByGpuid(const string gpuid); + void startProcessByGpuid(); bool task_has_vpt_algor(const std::string &task_id); bool task_has_face_algor(const std::string &task_id); void cuda_free_wrap(sy_img &img); @@ -202,7 +202,7 @@ private: int everyframe_process(vector &task_in_play_id, sy_img *images, vector &ol_det_result); private: - map gpuProcessthreadMap; // 本想做个多GPU的,但是原版的多GPU设置由上层来做,而且似乎可以更好 + pthread_t m_gpuProcessthread; list m_RgbDataList; std::mutex m_QueueMtx; bool m_bfinish; @@ -215,27 +215,6 @@ private: int licence_status_; string gpu_id_; - - // vector VPTResult; - std::atomic ProcessFlag; - bool SourceFlag; - unsigned char *imgDataDevice; - void *FrameTemp; - char *mModeSnapshotVideo; - char *mModeSnapshotLittle; - string viewTaskID; - - map> objDelete; - - FINISH_CALLBACK taskFinishCallbackFunc; - OBJECT_INFO_CALLBACK taskObjInfoCallbackFunc; - - bool beginSaveSnapshot; - boost::thread_group saveSnapshotsThreadGroup; - std::mutex taskMutex; - std::condition_variable taskCondVar; - bool AttributionAnalysis; // 用于控制,每帧分析只进行一个二次属性分析 - snapshot_reprocessing *m_snapshot_reprocessing{nullptr}; task_param_manager *m_task_param_manager{nullptr};