青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

飯中淹的避難所~~~~~

偶爾來避難的地方~

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  94 隨筆 :: 0 文章 :: 257 評論 :: 0 Trackbacks

 首先,我們來看一個例子。

  1 //    交互通道“沒有貨”狀態
  2 #define COMMUNICATIONCHANNEL_STATE_THINGSNOTEXISTS 0
  3 //    交互通道“有貨”狀態
  4 #define COMMUNICATIONCHANNEL_STATE_THINGSEXISTS 1
  5 //    交互通道結構
  6 struct CommunicationChannel
  7 {
  8     //    有貨沒貨的狀態
  9     volatile int iState;
 10     //    貨物:值0
 11     int iValue0;
 12     //    貨物:值1
 13     int iValue1;
 14 };
 15 //    線程參數
 16 struct ThreadParam
 17 {
 18     //    輸出通道
 19     CommunicationChannel * pOutputChannel;
 20     //    輸入通道
 21     CommunicationChannel * pInputChannel;
 22     //    減的值,用于制造奇數和偶數
 23     int iSubValue;
 24     //    值0的和
 25     int iSum0;
 26     //    值1的和
 27     int iSum1;
 28 };
 29 //    線程處理函數
 30 DWORD WINAPI ThreadProc( LPVOID lpParam )
 31 {
 32     //    取得參數
 33     ThreadParam * pParam = (ThreadParam*)lpParam;
 34     int iCounter = 0;
 35     bool bCountFinish = false;
 36     bool bCalcFinish = false;
 37 
 38     //    線程循環
 39     whiletrue )
 40     {
 41         //    向外輸出數值給另一個線程
 42         if!bCountFinish )
 43         {
 44             //    輸出通道是否是無貨狀態
 45             if( pParam->pOutputChannel->iState == COMMUNICATIONCHANNEL_STATE_THINGSNOTEXISTS )
 46             {
 47                 //    狀態滿足,輸出數字
 48                 if( iCounter < 10 )
 49                 {
 50                     //    頭10次,輸出一個序列
 51                     ++iCounter;
 52                     pParam->pOutputChannel->iValue0 = iCounter;
 53                     pParam->pOutputChannel->iValue1 = iCounter * 2 - pParam->iSubValue;
 54                 }
 55                 else
 56                 {
 57                     //    第11次,輸出0,不在進行向外輸出數字
 58                     pParam->pOutputChannel->iValue0 = 0;
 59                     pParam->pOutputChannel->iValue1 = 0;
 60                     bCountFinish = true;
 61                 }
 62                 //    修改輸出通道的狀態為有貨
 63                 pParam->pOutputChannel->iState = COMMUNICATIONCHANNEL_STATE_THINGSEXISTS;
 64             }
 65         }
 66         //    根據另一個線程輸入的數值進行計算
 67         if!bCalcFinish )
 68         {
 69             //    檢查輸入通道是否有貨
 70             if( pParam->pInputChannel->iState == COMMUNICATIONCHANNEL_STATE_THINGSEXISTS )
 71             {
 72                 //    狀態滿足
 73                 if( pParam->pInputChannel->iValue0 != 0 )
 74                 {
 75                     //    輸入不是0,就累加到和上
 76                     pParam->iSum0 += pParam->pInputChannel->iValue0;
 77                     pParam->iSum1 += pParam->pInputChannel->iValue1;
 78                     //    修改輸入通道為無貨
 79                     pParam->pInputChannel->iState = COMMUNICATIONCHANNEL_STATE_THINGSNOTEXISTS;
 80                 }
 81                 else
 82                 {
 83                     //    否則,結束掉計算輸入數值
 84                     //    因為另一個輸出0就表示不再有新貨到達
 85                     bCalcFinish = true;
 86                 }
 87             }
 88         }
 89         //    輸出和計算過程都結束,就跳出線程循環
 90         if( bCountFinish &&
 91             bCalcFinish )
 92             break;
 93     }
 94 
 95     return 0;
 96 }
 97 
 98 int _tmain(int argc, _TCHAR* argv[])
 99 {
100     //    初始化兩個交互通道,用于A到B的信息傳送和B到A的信息傳送。
101     struct CommunicationChannel A2BChannel = { COMMUNICATIONCHANNEL_STATE_THINGSNOTEXISTS, 00 };
102     struct CommunicationChannel B2AChannel = { COMMUNICATIONCHANNEL_STATE_THINGSNOTEXISTS, 00 };
103     //    初始化兩個線程參數,用于線程A和線程B
104     struct ThreadParam ThreadAParam = { 
105         &A2BChannel,
106         &B2AChannel,
107         0,
108         0,
109         0
110     };
111     struct ThreadParam ThreadBParam = { 
112         &B2AChannel,
113         &A2BChannel,
114         1,
115         0,
116         0
117     };
118 
119     //    創建線程A,B,并等待他們結束。
120     DWORD dwId = 0;
121     HANDLE hThreadA = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, &ThreadAParam, 0&dwId );
122     HANDLE hThreadB = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, &ThreadBParam, 0&dwId );
123     WaitForSingleObject( hThreadA, INFINITE );
124     WaitForSingleObject( hThreadB, INFINITE );
125     //    輸出線程A,B的計算結果。
126     printf( "Thread A sum0 = %d sum1 = %d\n", ThreadAParam.iSum0, ThreadAParam.iSum1 );
127     printf( "Thread B sum0 = %d sum1 = %d\n", ThreadBParam.iSum0, ThreadBParam.iSum1 );
128 
129     //    計算并輸出正確的結果,用于比較這個方法的計算結果是否正確。
130     int iCorrectSum0 = 0;
131     int iCorrectSum1A = 0;
132     int iCorrectSum1B = 0;
133     forint i = 1;i <= 10++i )
134     {
135         iCorrectSum0 += i;
136         iCorrectSum1A += i * 2 - 1;
137         iCorrectSum1B += i * 2;
138     }
139     printf( "Correct sum0 = %d sum1A = %d sum1B = %d\n", iCorrectSum0, iCorrectSum1A, iCorrectSum1B );
140 
141     return 0;
142 }
143 
144 

這個例子,使用第一篇里面的方法,實現了兩個線程雙向通信。

線程處理函數里面進行的事情很簡單,就是:輸出通道沒貨,就放貨進去,輸入通道有貨,就取貨計算。

在這個過程里,我們將線程A的輸出和線程B的計算結合起來看,稱為一個任務。

這個任務,它是如下圖所示的過程進行處理的。





紅色部分,是任務的主要處理部分。綠色的部分,則是隔離兩個線程中處理部分的重要因素。

從圖上看,如果填充數據和使用數據的紅色部分在垂直方向有交錯,那么,就會導致線程同步問題。

但是要那樣,需要狀態滿足要求在設置狀態的前面才行。上帝說,那是不可能的,不設置狀態,怎么可能達成狀態滿足要求。除非線程B穿越了。

所以,使用這種方法,紅色部分永遠不會重合,也就實現了無鎖的線程通信!當然,只是在兩個線程間實現了。

從單個通道來看,這種方法可以形象的看作一個線程在不斷的喂數據,另一個線程則在不斷的吃數據。這里就簡單的稱為“喂食”。

喂食”是一種可用的方法,不過它也有缺點,比如得等另一個線程吃完才能喂新的食物;或者另一個線程得等第一個線程去喂才有東西吃。

接下來,得挑戰點高難度的:突破喂食,以及兩個線程的限制。






posted on 2010-05-06 14:49 飯中淹 閱讀(1676) 評論(3)  編輯 收藏 引用 所屬分類: 數據算法分析

評論

# re: 無鎖線程通信(2):例程與分析 2010-05-06 16:09 fcc
在網上查了好久的資料,終于明白樓主的做法是不恰當的,在某些編譯環境下、某些編譯參數設置下可能是可行的,但并非嚴謹的。參見一篇著名的論文Threads Cannot Be Implemented As a Library。在此文中,舉出了兩個例子,1 Compilers may reorder memory operations 2 The hardware may reorder memory operations 。綜上,除非保證程序必定按源代碼一致的順序執行指令,否則樓主提供的這種多線程編程模式是不能嚴格保證安全的。以上拋磚引玉,僅供探討。  回復  更多評論
  

# re: 無鎖線程通信(2):例程與分析 2010-05-06 16:34 shbooom
就算不考慮編譯器優化,這個方法也是無效的。。。檢查和置位完全是兩個原子操作  回復  更多評論
  

# re: 無鎖線程通信(2):例程與分析 2010-05-06 16:42 飯中淹
@fcc
確實是存在這種情況。
@shbooom
如果不考慮優化,還是可以用的,這個方法。

  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品亚洲一区二区| 欧美在线观看视频| 欧美无乱码久久久免费午夜一区| 国产精品久久网| 亚洲一区欧美激情| 亚洲一区二区在线看| 亚洲一区在线播放| 亚洲一区二区三区在线| 亚洲在线成人| 午夜精品视频一区| 香蕉久久精品日日躁夜夜躁| 亚洲欧美日韩国产一区二区三区| 亚洲在线播放电影| 免费在线国产精品| 欧美成人福利视频| 欧美日韩亚洲高清| 国产欧美精品久久| 亚洲高清123| 在线一区视频| 久久久久国产精品人| 欧美激情一区二区三区在线视频观看 | 亚洲激情影视| 亚洲国产精品日韩| 久久精品国产免费看久久精品| 这里只有精品在线播放| av72成人在线| 91久久精品美女高潮| 99re国产精品| 久久国内精品自在自线400部| 久久激情五月激情| 欧美激情亚洲激情| 亚洲欧美美女| 欧美肥婆在线| 国产视频一区三区| 一区二区三区偷拍| 欧美成人国产va精品日本一级| 中国亚洲黄色| 欧美激情1区2区| 激情久久久久| 欧美在线网址| 亚洲日本成人| 狼人社综合社区| 国产亚洲欧美一区在线观看 | 狠狠色噜噜狠狠狠狠色吗综合| 一本色道精品久久一区二区三区| 久久久久国产成人精品亚洲午夜| 日韩午夜在线| 欧美久久电影| 亚洲伦理在线观看| 欧美黄色一区| 六月婷婷一区| 亚洲福利视频网| 巨乳诱惑日韩免费av| 亚洲欧美一区二区三区极速播放| 欧美色另类天堂2015| 中文在线不卡| 一本色道久久综合亚洲精品高清 | 美女视频黄a大片欧美| 亚洲精品乱码久久久久久蜜桃91 | 欧美成人69av| 亚洲高清在线| 久久福利电影| 999亚洲国产精| 欧美日韩中文字幕精品| 亚洲最新合集| 一本色道久久综合亚洲91| 欧美日韩一区二区三区在线观看免| 91久久视频| 亚洲精品老司机| 欧美日韩视频在线观看一区二区三区| a4yy欧美一区二区三区| 99这里只有久久精品视频| 国产精品v欧美精品∨日韩| 亚洲专区欧美专区| 午夜精品久久久久久久| 国产日韩亚洲欧美| 每日更新成人在线视频| 欧美成ee人免费视频| 99国产精品自拍| 99精品热视频| 国产中文一区二区| 欧美韩日高清| 国产精品成人aaaaa网站| 亚洲欧美在线播放| 久久国产免费看| 亚洲美女淫视频| 中文一区二区| 在线观看不卡av| 亚洲免费观看高清完整版在线观看熊 | 夜夜爽av福利精品导航| 国产精品99久久99久久久二8 | 久久久久久精| 蜜臀av一级做a爰片久久| 宅男噜噜噜66一区二区| 欧美亚洲三区| 99综合电影在线视频| 亚洲一区欧美激情| 亚洲高清毛片| 亚洲综合丁香| 亚洲日韩欧美视频| 亚洲永久免费精品| 亚洲国产综合91精品麻豆| 一区二区三区产品免费精品久久75| 国产麻豆精品久久一二三| 欧美11—12娇小xxxx| 欧美性jizz18性欧美| 欧美va亚洲va香蕉在线| 午夜激情一区| 亚洲免费成人| 久久久久久亚洲精品杨幂换脸 | 91久久嫩草影院一区二区| 亚洲综合第一页| 一本色道久久综合亚洲精品高清| 欧美一区二区三区四区夜夜大片 | 欧美亚洲免费在线| 亚洲性感美女99在线| 久久婷婷蜜乳一本欲蜜臀| 亚洲一级黄色| 欧美二区在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美四级剧情无删版影片| 亚洲国产欧美在线人成| 伊人成人在线| 欧美在线影院| 欧美在线播放高清精品| 国产精品成人va在线观看| 亚洲精品欧美| 亚洲电影免费| 久久综合给合久久狠狠狠97色69| 久久国产精品久久精品国产| 国产精品久久久久久户外露出| 亚洲国产精品小视频| 亚洲日本欧美| 欧美va亚洲va日韩∨a综合色| 免费久久99精品国产自在现线| 国产日韩欧美不卡| 亚洲欧美久久久| 久久精品视频一| 狠狠综合久久| 久久久久久欧美| 欧美激情国产精品| 亚洲欧洲一区二区在线播放| 裸体歌舞表演一区二区| 欧美黄色小视频| 亚洲最新视频在线播放| 欧美日韩免费高清| 99精品国产一区二区青青牛奶| 亚洲香蕉网站| 国产午夜久久久久| 久久精品视频导航| 蜜臀va亚洲va欧美va天堂| 亚洲国产精品ⅴa在线观看| 男男成人高潮片免费网站| 亚洲人成欧美中文字幕| 亚洲午夜电影网| 国产视频在线观看一区二区三区 | 一区二区三区国产精华| 午夜精品福利视频| 国产亚洲精品久| 久久婷婷色综合| 亚洲欧洲久久| 欧美一区日韩一区| 在线欧美福利| 欧美日韩亚洲综合一区| 午夜老司机精品| 欧美成人精品激情在线观看| 日韩亚洲综合在线| 亚洲欧美日韩综合国产aⅴ| 欧美在线观看网址综合| 激情成人综合网| 欧美日本亚洲韩国国产| 西瓜成人精品人成网站| 亚洲国产经典视频| 性欧美精品高清| 亚洲精品久久嫩草网站秘色| 欧美日韩精品在线播放| 亚欧美中日韩视频| 欧美国产成人在线| 欧美亚洲在线观看| 亚洲精品国产欧美| 国产亚洲视频在线观看| 欧美精品福利在线| 久久av免费一区| 一区二区三区欧美视频| 欧美电影免费观看网站| 亚洲欧美日韩综合aⅴ视频| 亚洲国产乱码最新视频| 国产欧美日韩精品丝袜高跟鞋| 欧美成人精品不卡视频在线观看| 亚洲欧美日韩中文在线制服| 亚洲三级视频| 欧美成人a视频| 久久久噜噜噜久久久| 午夜国产精品影院在线观看| 日韩视频二区| 亚洲激情影院| 亚洲成色精品| 亚洲电影在线| 亚洲第一偷拍| 在线观看国产成人av片|