globel_param.h
#pragma once
#ifndef GLOBE_PARAM_H
#define GLOBE_PARAM_H
#include<pthread.h>
#include"tensorrt_sdk_error_code.h"
typedef struct Globel_Float_
{
float nms_thresh_globe;
float conf_thresh_globe;
pthread_rwlock_t rwlock; //声明读写锁
}Globel_Float;
Error_Code init_lock();
Error_Code read_globel_param( float &nms,float& conf ); //读者加读锁
Error_Code set_globel_param(float &nms,float& conf); //写者加写锁
Error_Code destory_lock();
//};
#endif // TENSORRT_SDK_H
globe_param.cpp
#include"globe_param.h"
Globel_Float nms_conf;
Error_Code init_lock(){
// nms_conf.rwlock = PTHREAD_RWLOCK_INITIALIZER;
pthread_rwlock_init(&nms_conf.rwlock, NULL); //初始化读写锁
return OPERATION_SUCCESS;
}
Error_Code destory_lock(){
pthread_rwlock_destroy(&nms_conf.rwlock); //销毁读写锁
return OPERATION_SUCCESS;
}
Error_Code read_globel_param( float &nms,float& conf ) //读者加读锁
{
pthread_rwlock_rdlock( &nms_conf.rwlock );
nms = nms_conf.nms_thresh_globe;
conf = nms_conf.conf_thresh_globe;
pthread_rwlock_unlock( &nms_conf.rwlock );
return OPERATION_SUCCESS;
}
Error_Code set_globel_param(float &nms,float& conf) //写者加写锁
{
pthread_rwlock_wrlock( &nms_conf.rwlock );
nms_conf.nms_thresh_globe = nms;
nms_conf.conf_thresh_globe = conf;
pthread_rwlock_unlock( &nms_conf.rwlock );
return OPERATION_SUCCESS;
}
在使用中遇到一个bug提示,大概是这样的:multiple definition of `xxxx`
多重定义,我找了半天也没看到多次定义的地方,然后参考了下面这篇文章,其实就是将全局变量的声明和定义分离开;
参考:https://blog.csdn.net/mantis_1984/article/details/53571758,下面是解决方法:
即在.c文件中声明变量,然后在头文件.h所有的变量声明前加上extern,注意在.h文件中就不要对变量进行初始
化赋值了。然后其他需要使用全局变量的.c文件中包含.h文件即可。编译器会为.c生成目标文件,然后链接时,
如果该.c文件使用了全局变量,链接器就会链接到此.c文件。其他文件需要使用此全局变量也是同样的方式,目
的其实只有一个,就是使变量在内存中唯一化。
然后就有了上面的代码;
在别处调用时只需要加入globel_param.h这个头文件;
注意:第一次使用的时候需要初始化锁,最后不用了就调用释放锁的函数,中间就可以加读锁/写锁;