• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Kisser Leon

            這個(gè)kisser不太冷
            posts - 100, comments - 102, trackbacks - 0, articles - 0

            環(huán)形緩沖

            Posted on 2010-04-01 09:17 kk 閱讀(651) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++
            環(huán)形緩沖是可以不用加鎖的。下面是一個(gè)實(shí)現(xiàn)的環(huán)形緩沖。使用c實(shí)現(xiàn),可能會(huì)出現(xiàn)write滿情況,這種情況導(dǎo)致的結(jié)果就是write不成功,數(shù)據(jù)沒(méi)寫進(jìn)去。
            我這里只是簡(jiǎn)單的丟了。
              1 //
              2 
              3 #include "stdafx.h"
              4 #include <windows.h>
              5 #include <time.h>
              6 #include <stdlib.h>
              7 
              8 #define MAX_BUF_LEN 20        // buf len // 必須要大于1
              9 int nRead = 0;                // read pos
             10 int nWrite = 0;                // write pos
             11 int buf[MAX_BUF_LEN] = {0}; // loop buf
             12 
             13 #define NN 20000
             14 __int64 sum = 0;
             15 __int64 lose = 0;
             16 __int64 total = (__int64)(1+NN)*(__int64)NN/2;
             17 bool bWriteFinished = false;
             18 
             19 void WriteBuf(int n)
             20 {
             21     int rpos = nRead;
             22     int wpos = nWrite;
             23     wpos++;
             24     // buf滿(即write又追上了read), 注為了避免與初始狀態(tài)重復(fù)判斷
             25     // 所以這里最后一個(gè)buf沒(méi)有寫就認(rèn)為已經(jīng)滿了。所以MAX_BUF_LEN不能為1
             26     // 這里,直接丟棄該buf
             27     if (wpos % MAX_BUF_LEN == rpos % MAX_BUF_LEN)
             28     {
             29         lose += n;
             30         return;
             31     }
             32 
             33     buf[nWrite] = n;
             34     nWrite++;
             35     if (nWrite == MAX_BUF_LEN)
             36         nWrite = 0;
             37 }
             38 
             39 int ReadBuf()
             40 {
             41     if (nWrite == nRead)
             42         return -1;
             43 
             44     int n = buf[nRead];
             45     nRead++;
             46     if (nRead == MAX_BUF_LEN)
             47         nRead = 0;
             48     return n;
             49 }
             50 
             51 DWORD WINAPI ReadThread(LPVOID lpParameter)
             52 {
             53     int tmp = 0;
             54     int count = 0;
             55     while (true)
             56     {
             57         //printf("ReadThread = %d\n", ReadBuf());
             58         tmp = ReadBuf();
             59         if (-1 != tmp)
             60         {
             61             count++;
             62             sum += tmp;
             63             if (count == NN)
             64             {
             65                 printf ("ReadThread finished!\n");
             66                 break;
             67             }
             68         }
             69         else if (bWriteFinished)
             70         {
             71             printf ("ReadThread finished222!\n");
             72             break;
             73         }
             74 
             75         Sleep(rand() % 10);
             76     }
             77     return 0;
             78 }
             79 
             80 DWORD WINAPI WriteThread(LPVOID lpParameter)
             81 {
             82     int n = 0;
             83     while (true)
             84     {
             85         n++;
             86         WriteBuf(n);
             87         if (n == NN)
             88         {
             89             printf ("WriteThread finished!\n");
             90             bWriteFinished = true;
             91             break;
             92         }
             93 
             94         Sleep(rand() % 10);
             95     }
             96     return 0;
             97 }
             98 
             99 int main(int argc, char* argv[])
            100 {
            101     srand(time(NULL));
            102 //     for (int i = 0; i < 10; i++)
            103 //     {
            104 //         printf ("rand = %d\n", rand() % 10);
            105 //     }
            106 
            107     DWORD threadid[2= {0};
            108     HANDLE hThread[2= {0};
            109     int param = 0;
            110     hThread[0= CreateThread(NULL, 0, ReadThread, &param, CREATE_SUSPENDED, &threadid[0]);
            111     ResumeThread(hThread[0]);
            112     hThread[1= CreateThread(NULL, 0, WriteThread, &param, CREATE_SUSPENDED, &threadid[1]);
            113     ResumeThread(hThread[1]);
            114 
            115     getchar();
            116 
            117     printf ("total = %lld\n", total);
            118     printf ("lose = %lld\n", lose);
            119     printf ("sum = %lld\n", sum);
            120 
            121     if (total == lose + sum)
            122     {
            123         printf ("loop buf works well!\n");
            124     }
            125     else
            126     {
            127         printf ("loop buf works wrong!\n");
            128     }
            129 
            130     return 0;
            131 }
            132 
            上面是加了測(cè)試代碼的,我測(cè)試了一下似乎沒(méi)問(wèn)題。
            注意:這里只允許一個(gè)線程讀,一個(gè)線程寫。如果是多個(gè)線程讀寫的話,需要鎖!
            另外,很多細(xì)節(jié)都沒(méi)考慮進(jìn)去
            狠狠色丁香久久婷婷综| 国产成人精品久久一区二区三区av| 超级碰碰碰碰97久久久久| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久久噜噜噜久久熟女AA片 | 久久国产精品成人免费| 9999国产精品欧美久久久久久| 国产视频久久| 亚洲伊人久久成综合人影院| 久久人人爽人人人人片av| 国产精品9999久久久久| 曰曰摸天天摸人人看久久久| 久久综合偷偷噜噜噜色| 久久精品国产只有精品2020 | 久久综合给久久狠狠97色| 国内精品久久久久伊人av| 亚洲Av无码国产情品久久| 国产精品99久久99久久久| 亚洲七七久久精品中文国产 | 国产精品美女久久久久| 欧美日韩精品久久久免费观看| 青草国产精品久久久久久| 色综合久久88色综合天天| 色欲av伊人久久大香线蕉影院| 久久久久久噜噜精品免费直播| 国产欧美久久久精品| 国产精品久久久久久久app| 国内精品久久久久久麻豆| 国内精品久久久久久99蜜桃| 中文字幕久久波多野结衣av| 伊人久久国产免费观看视频| 狠狠久久综合伊人不卡| 香蕉久久一区二区不卡无毒影院| 久久精品国产99国产精品澳门| 久久夜色精品国产噜噜麻豆| 国产精品99久久久精品无码| 久久人人爽人人爽人人片AV麻豆| 久久国产成人午夜AV影院| 成人国内精品久久久久影院| 国产成人久久AV免费| 久久亚洲日韩精品一区二区三区|