• <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 李侃 閱讀(979) 評論(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
            中文字幕无码精品亚洲资源网久久 | 亚洲精品无码久久毛片 | 色播久久人人爽人人爽人人片aV| 精品久久一区二区三区| 久久香蕉综合色一综合色88| 国内精品欧美久久精品| 99久久综合国产精品免费| 国内精品久久久人妻中文字幕| 久久精品国内一区二区三区| 伊人久久亚洲综合影院| 精品精品国产自在久久高清| 四虎影视久久久免费观看| 久久久久亚洲AV片无码下载蜜桃| 久久青青草原精品影院| 久久久久久久波多野结衣高潮| 久久精品国产69国产精品亚洲| 伊人久久精品影院| 国产亚洲成人久久| 久久精品人人做人人爽电影蜜月| 久久婷婷人人澡人人| 久久婷婷国产麻豆91天堂| 久久久久久精品免费看SSS| 久久久久女教师免费一区| 国产一级持黄大片99久久| 99久久国产精品免费一区二区| 久久国产精品免费| 四虎国产精品免费久久久| 久久精品无码午夜福利理论片| 久久婷婷五月综合成人D啪 | 亚洲国产精品18久久久久久| 久久人妻少妇嫩草AV蜜桃| 国产成人99久久亚洲综合精品| 亚洲AV无码1区2区久久 | 久久91精品国产91久久麻豆| 亚洲国产精品久久久天堂| 波多野结衣久久| 一本久久综合亚洲鲁鲁五月天| 久久综合久久综合久久综合| 精品国产福利久久久| 91久久精品国产成人久久| 亚洲一区中文字幕久久|