• <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无码久久久久久不卡网站| 东方aⅴ免费观看久久av| 精品综合久久久久久97| 精品久久亚洲中文无码| 久久精品国产精品亚洲毛片 | 少妇内射兰兰久久| 狠狠色丁香久久综合婷婷| 久久香蕉国产线看观看99| 久久国产精品一区| 久久久久波多野结衣高潮| 精品久久久久久亚洲精品| 99久久夜色精品国产网站| 久久久久久一区国产精品| 亚洲乱码精品久久久久..| 久久久精品久久久久特色影视| 思思久久精品在热线热| 国产69精品久久久久99尤物| 色妞色综合久久夜夜| 久久久久久国产精品免费免费| 久久精品国产网红主播| 中文无码久久精品| 欧美成人免费观看久久| 激情久久久久久久久久| 久久99国产精品一区二区| 日日躁夜夜躁狠狠久久AV| 久久亚洲精品无码aⅴ大香| 久久一区二区免费播放| 久久国产精品视频| 久久精品国产第一区二区| 精品视频久久久久| 久久强奷乱码老熟女网站| 国产精品美女久久久免费| 办公室久久精品| 青青青国产成人久久111网站| 成人久久综合网| 97久久精品午夜一区二区| 国产婷婷成人久久Av免费高清| 久久久久久夜精品精品免费啦| 亚洲女久久久噜噜噜熟女|