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

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

偶爾來(lái)避難的地方~

  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  94 隨筆 :: 0 文章 :: 257 評(píng)論 :: 0 Trackbacks

 首先,我們來(lái)看一個(gè)例子。

  1 //    交互通道“沒(méi)有貨”狀態(tài)
  2 #define COMMUNICATIONCHANNEL_STATE_THINGSNOTEXISTS 0
  3 //    交互通道“有貨”狀態(tài)
  4 #define COMMUNICATIONCHANNEL_STATE_THINGSEXISTS 1
  5 //    交互通道結(jié)構(gòu)
  6 struct CommunicationChannel
  7 {
  8     //    有貨沒(méi)貨的狀態(tài)
  9     volatile int iState;
 10     //    貨物:值0
 11     int iValue0;
 12     //    貨物:值1
 13     int iValue1;
 14 };
 15 //    線(xiàn)程參數(shù)
 16 struct ThreadParam
 17 {
 18     //    輸出通道
 19     CommunicationChannel * pOutputChannel;
 20     //    輸入通道
 21     CommunicationChannel * pInputChannel;
 22     //    減的值,用于制造奇數(shù)和偶數(shù)
 23     int iSubValue;
 24     //    值0的和
 25     int iSum0;
 26     //    值1的和
 27     int iSum1;
 28 };
 29 //    線(xiàn)程處理函數(shù)
 30 DWORD WINAPI ThreadProc( LPVOID lpParam )
 31 {
 32     //    取得參數(shù)
 33     ThreadParam * pParam = (ThreadParam*)lpParam;
 34     int iCounter = 0;
 35     bool bCountFinish = false;
 36     bool bCalcFinish = false;
 37 
 38     //    線(xiàn)程循環(huán)
 39     whiletrue )
 40     {
 41         //    向外輸出數(shù)值給另一個(gè)線(xiàn)程
 42         if!bCountFinish )
 43         {
 44             //    輸出通道是否是無(wú)貨狀態(tài)
 45             if( pParam->pOutputChannel->iState == COMMUNICATIONCHANNEL_STATE_THINGSNOTEXISTS )
 46             {
 47                 //    狀態(tài)滿(mǎn)足,輸出數(shù)字
 48                 if( iCounter < 10 )
 49                 {
 50                     //    頭10次,輸出一個(gè)序列
 51                     ++iCounter;
 52                     pParam->pOutputChannel->iValue0 = iCounter;
 53                     pParam->pOutputChannel->iValue1 = iCounter * 2 - pParam->iSubValue;
 54                 }
 55                 else
 56                 {
 57                     //    第11次,輸出0,不在進(jìn)行向外輸出數(shù)字
 58                     pParam->pOutputChannel->iValue0 = 0;
 59                     pParam->pOutputChannel->iValue1 = 0;
 60                     bCountFinish = true;
 61                 }
 62                 //    修改輸出通道的狀態(tài)為有貨
 63                 pParam->pOutputChannel->iState = COMMUNICATIONCHANNEL_STATE_THINGSEXISTS;
 64             }
 65         }
 66         //    根據(jù)另一個(gè)線(xiàn)程輸入的數(shù)值進(jìn)行計(jì)算
 67         if!bCalcFinish )
 68         {
 69             //    檢查輸入通道是否有貨
 70             if( pParam->pInputChannel->iState == COMMUNICATIONCHANNEL_STATE_THINGSEXISTS )
 71             {
 72                 //    狀態(tài)滿(mǎn)足
 73                 if( pParam->pInputChannel->iValue0 != 0 )
 74                 {
 75                     //    輸入不是0,就累加到和上
 76                     pParam->iSum0 += pParam->pInputChannel->iValue0;
 77                     pParam->iSum1 += pParam->pInputChannel->iValue1;
 78                     //    修改輸入通道為無(wú)貨
 79                     pParam->pInputChannel->iState = COMMUNICATIONCHANNEL_STATE_THINGSNOTEXISTS;
 80                 }
 81                 else
 82                 {
 83                     //    否則,結(jié)束掉計(jì)算輸入數(shù)值
 84                     //    因?yàn)榱硪粋€(gè)輸出0就表示不再有新貨到達(dá)
 85                     bCalcFinish = true;
 86                 }
 87             }
 88         }
 89         //    輸出和計(jì)算過(guò)程都結(jié)束,就跳出線(xiàn)程循環(huán)
 90         if( bCountFinish &&
 91             bCalcFinish )
 92             break;
 93     }
 94 
 95     return 0;
 96 }
 97 
 98 int _tmain(int argc, _TCHAR* argv[])
 99 {
100     //    初始化兩個(gè)交互通道,用于A到B的信息傳送和B到A的信息傳送。
101     struct CommunicationChannel A2BChannel = { COMMUNICATIONCHANNEL_STATE_THINGSNOTEXISTS, 00 };
102     struct CommunicationChannel B2AChannel = { COMMUNICATIONCHANNEL_STATE_THINGSNOTEXISTS, 00 };
103     //    初始化兩個(gè)線(xiàn)程參數(shù),用于線(xiàn)程A和線(xiàn)程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     //    創(chuàng)建線(xiàn)程A,B,并等待他們結(jié)束。
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     //    輸出線(xiàn)程A,B的計(jì)算結(jié)果。
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     //    計(jì)算并輸出正確的結(jié)果,用于比較這個(gè)方法的計(jì)算結(jié)果是否正確。
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 

這個(gè)例子,使用第一篇里面的方法,實(shí)現(xiàn)了兩個(gè)線(xiàn)程雙向通信。

線(xiàn)程處理函數(shù)里面進(jìn)行的事情很簡(jiǎn)單,就是:輸出通道沒(méi)貨,就放貨進(jìn)去,輸入通道有貨,就取貨計(jì)算。

在這個(gè)過(guò)程里,我們將線(xiàn)程A的輸出和線(xiàn)程B的計(jì)算結(jié)合起來(lái)看,稱(chēng)為一個(gè)任務(wù)

這個(gè)任務(wù),它是如下圖所示的過(guò)程進(jìn)行處理的。





紅色部分,是任務(wù)的主要處理部分。綠色的部分,則是隔離兩個(gè)線(xiàn)程中處理部分的重要因素。

從圖上看,如果填充數(shù)據(jù)和使用數(shù)據(jù)的紅色部分在垂直方向有交錯(cuò),那么,就會(huì)導(dǎo)致線(xiàn)程同步問(wèn)題。

但是要那樣,需要狀態(tài)滿(mǎn)足要求在設(shè)置狀態(tài)的前面才行。上帝說(shuō),那是不可能的,不設(shè)置狀態(tài),怎么可能達(dá)成狀態(tài)滿(mǎn)足要求。除非線(xiàn)程B穿越了。

所以,使用這種方法,紅色部分永遠(yuǎn)不會(huì)重合,也就實(shí)現(xiàn)了無(wú)鎖的線(xiàn)程通信!當(dāng)然,只是在兩個(gè)線(xiàn)程間實(shí)現(xiàn)了。

從單個(gè)通道來(lái)看,這種方法可以形象的看作一個(gè)線(xiàn)程在不斷的喂數(shù)據(jù),另一個(gè)線(xiàn)程則在不斷的吃數(shù)據(jù)。這里就簡(jiǎn)單的稱(chēng)為“喂食”。

喂食”是一種可用的方法,不過(guò)它也有缺點(diǎn),比如得等另一個(gè)線(xiàn)程吃完才能喂新的食物;或者另一個(gè)線(xiàn)程得等第一個(gè)線(xiàn)程去喂才有東西吃。

接下來(lái),得挑戰(zhàn)點(diǎn)高難度的:突破喂食,以及兩個(gè)線(xiàn)程的限制。






posted on 2010-05-06 14:49 飯中淹 閱讀(1673) 評(píng)論(3)  編輯 收藏 引用 所屬分類(lèi): 數(shù)據(jù)算法分析

評(píng)論

# re: 無(wú)鎖線(xiàn)程通信(2):例程與分析 2010-05-06 16:09 fcc
在網(wǎng)上查了好久的資料,終于明白樓主的做法是不恰當(dāng)?shù)模谀承┚幾g環(huán)境下、某些編譯參數(shù)設(shè)置下可能是可行的,但并非嚴(yán)謹(jǐn)?shù)摹⒁?jiàn)一篇著名的論文Threads Cannot Be Implemented As a Library。在此文中,舉出了兩個(gè)例子,1 Compilers may reorder memory operations 2 The hardware may reorder memory operations 。綜上,除非保證程序必定按源代碼一致的順序執(zhí)行指令,否則樓主提供的這種多線(xiàn)程編程模式是不能?chē)?yán)格保證安全的。以上拋磚引玉,僅供探討。  回復(fù)  更多評(píng)論
  

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

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

  回復(fù)  更多評(píng)論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久九九九九| 国产私拍一区| 亚洲精品日日夜夜| 久久一区二区三区av| 麻豆91精品| 亚洲美女av黄| 国产精品视频免费一区| 午夜在线成人av| 免费永久网站黄欧美| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美午夜精品| 欧美在线免费观看| 亚洲电影免费观看高清完整版| 久久噜噜亚洲综合| 亚洲精品女人| 亚洲成人自拍视频| 国产精品扒开腿做爽爽爽视频| 国产精品福利在线观看| 另类综合日韩欧美亚洲| 久久大逼视频| 亚洲午夜女主播在线直播| 国产一区二区三区精品欧美日韩一区二区三区 | 激情成人综合网| 欧美日韩亚洲激情| 久久激情视频久久| 午夜激情久久久| 一区二区三区国产盗摄| 欧美伊人久久| 欧美日韩在线精品| 一区视频在线看| 亚洲欧美日韩在线不卡| 亚洲一区二区av电影| 久久香蕉国产线看观看av| 欧美一区二区视频网站| 亚洲一级特黄| 欧美成人黄色小视频| 久久综合狠狠综合久久综青草| 亚洲国产中文字幕在线观看| 能在线观看的日韩av| 99re6这里只有精品| 亚洲精品乱码久久久久久蜜桃91| 亚洲午夜国产成人av电影男同| 亚洲精选视频在线| 久久理论片午夜琪琪电影网| 国产精品免费电影| 国产精品欧美激情| 日韩一区二区久久| 中文久久乱码一区二区| 一区二区动漫| 欧美亚洲自偷自偷| 久久精品亚洲一区二区| 亚洲手机视频| 欧美新色视频| 榴莲视频成人在线观看| 亚洲区欧美区| 欧美精品二区| 国产精品高潮呻吟久久av黑人| 亚洲成人在线| 狂野欧美激情性xxxx| 欧美制服丝袜| 狠狠久久亚洲欧美专区| 亚洲日本国产| 欧美激情一二三区| 99日韩精品| 久久精品水蜜桃av综合天堂| 久久综合久久久久88| 韩国女主播一区| 米奇777超碰欧美日韩亚洲| 欧美一区二区三区成人| 欧美成人午夜| 欧美色大人视频| 韩日在线一区| 久久综合色综合88| 久久先锋资源| 夜夜嗨av一区二区三区网站四季av| 亚洲在线日韩| 欧美阿v一级看视频| 久久久亚洲国产天美传媒修理工 | 亚洲欧美综合国产精品一区| 欧美中在线观看| 性久久久久久久久| 一区二区视频免费在线观看| 久久这里只有| 欧美二区不卡| 亚洲免费在线视频| 性欧美大战久久久久久久免费观看 | 亚洲欧美日韩一区| 韩日精品在线| 亚洲精品一线二线三线无人区| 欧美日韩一区二区高清| 久久成人av少妇免费| 久久亚洲高清| 亚洲在线第一页| 久久精品视频免费| 亚洲一区二区精品在线| 亚洲欧美日韩中文在线制服| 一区二区在线观看av| aaa亚洲精品一二三区| 国产欧美日韩在线| 一区二区久久久久久| 亚洲综合国产激情另类一区| 欧美va亚洲va日韩∨a综合色| 国产精品高清在线观看| 老鸭窝毛片一区二区三区| 欧美日韩视频不卡| 噜噜爱69成人精品| 国产精品亚洲不卡a| 亚洲激情网址| 欧美成人黑人xx视频免费观看| 久久久精品国产免费观看同学| 精品不卡视频| 亚洲精品国产精品国产自| 国产欧美日本在线| 亚洲人成人一区二区三区| 国产亚洲电影| 亚洲作爱视频| 日韩亚洲视频| 噜噜噜91成人网| 久久久久久有精品国产| 亚洲亚洲精品三区日韩精品在线视频 | 欧美黄色大片网站| 亚洲精品美女在线| 久久久久九九九九| 欧美在线免费视频| 国产精品日韩欧美大师| 亚洲免费av观看| 99国产精品自拍| 欧美激情一区二区在线| 欧美激情精品久久久久久| 国语自产精品视频在线看| 亚洲一二区在线| 亚洲欧洲av一区二区| 欧美日韩一卡二卡| 99成人在线| 亚洲永久在线| 国产精品一区二区三区四区五区| 欧美在线网址| 国产精品久久久久久影视| 99精品视频网| 亚洲欧美福利一区二区| 欧美日韩黄视频| 久久久亚洲欧洲日产国码αv | 亚洲成人在线网| 久久人人97超碰人人澡爱香蕉 | 在线亚洲自拍| 国产一区观看| 亚洲国产小视频| 亚洲美女av电影| 欧美猛交免费看| 欧美一二三视频| 国产一级一区二区| 久久永久免费| 99精品视频免费观看| 午夜精品一区二区三区在线播放 | 欧美高清日韩| 国产农村妇女精品| 性欧美videos另类喷潮| 久久综合九色综合欧美就去吻| 狠狠综合久久av一区二区老牛| 久久久欧美一区二区| 亚洲国产精品一区二区久| 在线免费观看视频一区| 欧美大片免费观看| 一本久久a久久免费精品不卡| 欧美亚洲综合网| 伊人久久大香线蕉综合热线| 日韩亚洲欧美一区二区三区| 亚洲一区二区精品在线| 国产女人aaa级久久久级| 亚洲另类春色国产| 久久婷婷成人综合色| 日韩视频精品| 欧美一区二区视频网站| 亚洲国产成人高清精品| 亚洲一区二区三区在线看| 亚洲破处大片| 久久久国产午夜精品| 亚洲国产一区二区a毛片| 亚洲一二三四区| 亚洲第一在线综合在线| 欧美日韩一区二区三区在线看 | 亚洲男女自偷自拍图片另类| 暖暖成人免费视频| 欧美一区二区福利在线| 亚洲毛片av| 狠狠色狠狠色综合人人| 欧美日韩另类综合| 久久蜜臀精品av| 亚洲欧美久久久| 一本久久a久久免费精品不卡| 久久蜜臀精品av| 性欧美办公室18xxxxhd| 91久久久一线二线三线品牌| 国产麻豆一精品一av一免费| 欧美黄色免费| 久久午夜电影网| 久久精品国产91精品亚洲| 亚洲调教视频在线观看| 亚洲国产精品福利| 免费欧美日韩国产三级电影|