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 的意思 .

 

 

 

創作者介紹
創作者 hedgezzz 的頭像
hedgezzz

hedgezzz的部落格

hedgezzz 發表在 痞客邦 留言(0) 人氣()