struct datafeed_
{
unsigned int seqno ;
int iWriteSwitch ;
char stkid[18] ;
double bestbuyprc1 ;
int bestbuyvol1 ;
double bestbuyprc2 ;
int bestbuyvol2 ;
double bestbuyprc3 ;
int bestbuyvol3 ;
double bestbuyprc4 ;
int bestbuyvol4 ;
double bestbuyprc5 ;
int bestbuyvol5 ;
double bestsellprc1 ;
int bestsellvol1 ;
double bestsellprc2 ;
int bestsellvol2 ;
double bestsellprc3 ;
int bestsellvol3 ;
double bestsellprc4 ;
int bestsellvol4 ;
double bestsellprc5 ;
int bestsellvol5 ;
double matchprc ;
int matchtotalvol ;
} ;
typedef struct datafeed_ datafeed ;
static datafeed *conf;
void PrintData(int idy)
{
datafeed localdata ;
int seqno1,seqno2,itrycnt=0 ;
while(1){
itrycnt++ ;
if(itrycnt > 50)
break ;
seqno1 = (conf+idy)->seqno ;
if(seqno1 % 2 == 1)
continue ;
int ioffset = offsetof(datafeed,stkid) ;
memcpy((char*) &localdata + ioffset,(conf+idy)->stkid,sizeof(datafeed) - ioffset) ;
seqno2 = (conf+idy)->seqno ;
if(seqno1 != seqno2)
continue ;
localdata.seqno = seqno1 ;
break ;
} //while
if(itrycnt > 50){
printf("must be wrong \n") ; return ;
}
} // PrintData
itrycnt 本來不需要 , 但是萬一寫這個結構的 process/thread seqno++ 之後掛掉 , 來不及變成偶數 , 至少不會變成無窮迴圈 ,
seqlock 極快 , 要做到 50 次都讀到結構更改中是不可能的 !!!
offsetof 是要 compiler 幫忙找 stkid 在 datafeed structure 的第幾個 byte , 以後萬一 datafeed 修改內容 ,
程式不用擔心 memcpy copy 錯位址 , &localdata 因為要加上 ioffset byte , 所以先轉態成 (char *) 這樣加上 ioffset
才真正是 加上 ioffset byte 的意思 .
留言列表