渣渣小白读二爷的rtklib源码,看到svr结构体里的互斥量没看懂怎么用,补了下相关知识如下:
step1:先看这个搞懂什么是多线程和互斥量
step2:再看源代码:
#define thread_t pthread_t
#define lock_t pthread_mutex_t
#define initlock(f) pthread_mutex_init(f,NULL)
#define lock(f) pthread_mutex_lock(f)
#define unlock(f) pthread_mutex_unlock(f)
#define FILEPATHSEP '/'
typedef struct { /* RTK server type */
int pause; /* pause program (0:off,1:on ) */
//...省略中间部分
thread_t thread; /* server thread */
lock_t lock; /* lock flag */
} rtksvr_t;
extern void rtksvrlock (rtksvr_t *svr) {lock (&svr->lock);}
extern void rtksvrunlock(rtksvr_t *svr) {unlock(&svr->lock);}
/* decode download file ------------------------------------------------------*/
static void decodefile(rtksvr_t *svr, int index)
{
nav_t nav={0};
char file[1024];
int nb;
tracet(4,"decodefile: index=%d\n",index);
rtksvrlock(svr);
/* check file path completed */
if ((nb=svr->nb[index])<=2||
svr->buff[index][nb-2]!='\r'||svr->buff[index][nb-1]!='\n') {
rtksvrunlock(svr);
return;
}
strncpy(file,(char*)svr->buff[index],nb-2); file[nb-2]='\0';
svr->nb[index]=0;
rtksvrunlock(svr);
if (svr->format[index]==STRFMT_SP3) { /* precise ephemeris */
/* read sp3 precise ephemeris */
readsp3(file,&nav,0);
if (nav.ne<=0) {
tracet(1,"sp3 file read error: %s\n",file);
return;
}
/* update precise ephemeris */
rtksvrlock(svr);
if (svr->nav.peph) free(svr->nav.peph);
svr->nav.ne=svr->nav.nemax=nav.ne;
svr->nav.peph=nav.peph;
svr->ftime[index]=utc2gpst(timeget());
strcpy(svr->files[index],file);
rtksvrunlock(svr);
}
else if (svr->format[index]==STRFMT_RNXCLK) { /* precise clock */
/* read rinex clock */
if (readrnxc(file,&nav)<=0) {
tracet(1,"rinex clock file read error: %s\n",file);
return;
}
/* update precise clock */
rtksvrlock(svr);
if (svr->nav.pclk) free(svr->nav.pclk);
svr->nav.nc=svr->nav.ncmax=nav.nc;
svr->nav.pclk=nav.pclk;
svr->ftime[index]=utc2gpst(timeget());
strcpy(svr->files[index],file);
rtksvrunlock(svr);
}
}
step3:分析如下:
首先,在结构体中设置互斥量成员的目的:是为了在调用函数对svr结构体成员做修改时直接使用成员互斥量,用来替代在函数中新建一个互斥量进行操作。在这个基础上理解代码就相对明白了好多。
其次,可以在节选的一部分代码中可以看到rtksvrlock和rtksvrunlock是成对出现的,这是显然的。
最后,锁住代码进行的操作大部分是对结构体成员进行的赋值操作,或者在stream.cc文件中是对stream结构体的操作。