• <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>

            3d Game Walkman

            3d圖形渲染,網絡引擎 — tonykee's Blog
            隨筆 - 45, 文章 - 0, 評論 - 309, 引用 - 0
            數據加載中……

            多線程中MutiRead/SingleWrite互斥的實現(原創)

            今天晚上總算有點收獲,寫服務器,要用到(多讀/單寫)互斥,也就是MutiRead/SingleWrite互斥的實現,采用用非信號量來實現,用戶模式,非內核模式,實現高效的線程調度

            源代碼如下:

            // ThreadTest.cpp : 定義控制臺應用程序的入口點。
            //

            #include "stdafx.h"
            #include <process.h>
            #include <windows.h>
            #include <stdio.h>


            //關鍵區鎖
            class MemLock {
             CRITICAL_SECTION _crisection;
            public:
             MemLock(){
              InitializeCriticalSection( &_crisection );
             }

             ~MemLock(){
              DeleteCriticalSection( &_crisection );    
             }

             void lock() {
              EnterCriticalSection( &_crisection );     
             }

             void unlock() {
              LeaveCriticalSection( &_crisection );     
             }
            };

            //共用資源
            class ShareSource
            {
             MemLock mlock;
             volatile LONG    g_bResourceUse;
             volatile LONG    g_bResourceUse1;

             int j;


            public:
               ShareSource()
               {
                  g_bResourceUse = 0;
               g_bResourceUse1 = 0;
               }
               void read(char *user)
               {
             
              while(InterlockedIncrement(&g_bResourceUse)>0)
              {
               if(g_bResourceUse1==0)
               {
                printf("用戶%s 開始讀 ",  user);
                Sleep(100);
                printf("用戶%s 正在讀..", user);
                Sleep(100);
                printf("用戶%s 讀完了 \r\n",  user);
                Sleep(100);
               }
               InterlockedDecrement(&g_bResourceUse);
               Sleep(10);
               //printf("%d \r\n", j);
              } 
               }

               void write(char *user)
               {
                mlock.lock();
                 while(InterlockedIncrement(&g_bResourceUse1)>0 )
              {
                 if(g_bResourceUse==0)
              {
               printf("[用戶%s 開始寫..", user);
               Sleep(100);
               printf("用戶%s 正在寫..", user);
               Sleep(100);
               printf("用戶%s 寫完了]..\r\n", user);
               Sleep(100);
              }
              InterlockedDecrement(&g_bResourceUse1); 
              Sleep(10);
              }
              mlock.unlock();
               }
            };


            class ThreadTest
            {
            public:
             char user[20];
                ShareSource * share;
             HANDLE hThread;
                ThreadTest(char *_user, ShareSource * source)
             {
                strcpy(user, _user); //用戶名
                   hThread = 0;
                share = source;
             }

             //工作線程的方法
             static unsigned __stdcall  WorkThreadCallBackMothodRead(LPVOID param) {
              
               ThreadTest *th  = (ThreadTest *) param;
               while(1)
               th->share->read(th->user);
              
              return 0;
             }

             //工作線程的方法
             static unsigned __stdcall  WorkThreadCallBackMothodWrite(LPVOID param) {
              
                  ThreadTest *th  = (ThreadTest  *) param;
               while(1)
               th->share->write(th->user);
              
              return 0;
             }

             //開始讀線程
             void BeginReadThread()
             {
                   hThread = (HANDLE) _beginthreadex(0, 0, ThreadTest::WorkThreadCallBackMothodRead, (LPVOID)this , 0, 0);
             }

             //開始寫線程
             void BeginWriteThread()
             {
              hThread = (HANDLE) _beginthreadex(0, 0, ThreadTest::WorkThreadCallBackMothodWrite, (LPVOID)this , 0, 0);
             }

            };


            int _tmain(int argc, _TCHAR* argv[])
            {

             ShareSource source;
                ThreadTest T1("T1", &source);
             ThreadTest T2("T2", &source);
             ThreadTest T3("T3", &source);
             
             //前面兩個讀
             T1.BeginReadThread();
             T2.BeginReadThread();
             
             //最后一個線程寫
             T3.BeginWriteThread();

             getchar();
             return 0;
            }

             

            posted on 2008-01-09 01:10 李侃 閱讀(984) 評論(7)  編輯 收藏 引用 所屬分類: 網絡模塊

            評論

            # re: 多線程中MutiRead/SingleWrite互斥的實現(原創)  回復  更多評論   

            看了一會兒,理論上貌似可行,但是實際上效率應該還是不足。因為粒度依然沒有劃分明確。
            2008-01-09 10:20 | draracle

            # re: 多線程中MutiRead/SingleWrite互斥的實現(原創)  回復  更多評論   

            這種辦法很容易導致寫饑餓...
            一般來說寫的優先級應該比讀高一些
            2008-01-09 16:24 | eXile

            # re: 多線程中MutiRead/SingleWrite互斥的實現(原創)  回復  更多評論   

            而且你的這種實現存在死鎖的可能性, 即使不死鎖,也會使線程反復切換,效率不高
            2008-01-09 16:28 | eXile

            # re: 多線程中MutiRead/SingleWrite互斥的實現(原創)  回復  更多評論   

            死鎖倒應該不會,但是活鎖是難以避免了。
            2008-01-09 16:30 | 空明流轉

            # re: 多線程中MutiRead/SingleWrite互斥的實現(原創)  回復  更多評論   

            恩,看來這是一個很糟糕的實現,我再想想辦法看
            2008-01-09 19:30 | 李侃

            # re: 多線程中MutiRead/SingleWrite互斥的實現(原創)  回復  更多評論   

            請參考ACE或者Boost中的讀寫鎖
            2008-01-25 00:24 | 羅賓李

            # re: 多線程中MutiRead/SingleWrite互斥的實現(原創)  回復  更多評論   

            編程盡可能避免多線程, 1來調試不方便, 2來線程切換降低了總體效率(特別是多核的主流機器)

            要在 游戲本身的設計上減少線程之間數據共享
            2009-01-11 13:29 | llxisdsh
            国产精品久久久福利| 久久亚洲精品中文字幕三区| 大香网伊人久久综合网2020| 99久久国产免费福利| 欧美精品一区二区久久| 国产激情久久久久久熟女老人| 久久久久亚洲AV无码永不| 久久伊人精品青青草原高清| 久久久精品国产亚洲成人满18免费网站 | 潮喷大喷水系列无码久久精品 | 97精品国产97久久久久久免费| 久久久av波多野一区二区| 久久激情亚洲精品无码?V| 日韩人妻无码精品久久久不卡 | 亚洲?V乱码久久精品蜜桃 | 日日噜噜夜夜狠狠久久丁香五月 | 国产国产成人精品久久| 午夜视频久久久久一区| 久久久久久综合一区中文字幕 | 久久人人爽人人爽人人av东京热| 久久国产精品久久| 77777亚洲午夜久久多喷| 国产免费久久精品99久久| 狠狠色婷婷综合天天久久丁香| 伊人久久大香线蕉av不卡| 热99RE久久精品这里都是精品免费| 秋霞久久国产精品电影院| 99久久久精品免费观看国产| 囯产极品美女高潮无套久久久| 亚洲精品NV久久久久久久久久| 久久国产精品二国产精品| 国产成人无码精品久久久免费 | 18岁日韩内射颜射午夜久久成人| 亚洲va久久久噜噜噜久久| 久久婷婷国产剧情内射白浆 | 久久精品免费观看| 丁香五月网久久综合| 久久综合久久综合久久| 久久久久久久尹人综合网亚洲| 青青草原综合久久| 久久99国产精品成人欧美|