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

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

偶爾來(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>
            午夜亚洲一区| 亚洲人成毛片在线播放| 久久人体大胆视频| 久久久久久黄| 欧美不卡在线视频| 欧美日韩国产不卡| 国产精品毛片a∨一区二区三区| 国产精品成人观看视频国产奇米| 国产精品一级在线| 欲色影视综合吧| 亚洲精品久久久久久一区二区| 夜久久久久久| 久久婷婷人人澡人人喊人人爽| 亚洲福利视频在线| 91久久精品美女| 欧美一进一出视频| 欧美激情区在线播放| 国产日韩欧美视频| 亚洲精品一区二区三区蜜桃久| 午夜精品久久久久影视| 欧美国产精品久久| 亚洲女爱视频在线| 欧美精品一区二区高清在线观看| 国产免费成人av| 亚洲狼人精品一区二区三区| 欧美在线视频免费播放| 亚洲韩国一区二区三区| 欧美在线视频a| 国产精品国产三级国产专区53| 在线精品福利| 欧美中文在线免费| 亚洲精品中文字幕在线| 女人香蕉久久**毛片精品| 国产日韩综合| 先锋亚洲精品| 一区二区久久| 欧美欧美全黄| 亚洲精品视频在线看| 欧美成人免费大片| 久久九九免费| 狠狠干综合网| 久久久久久久一区| 亚洲午夜精品国产| 欧美va天堂| 久久久视频精品| 精品动漫3d一区二区三区| 欧美在线观看一区二区| 亚洲视频高清| 欧美视频一二三区| 亚洲天堂视频在线观看| 亚洲乱码精品一二三四区日韩在线| 麻豆成人综合网| 在线精品福利| 亚洲第一二三四五区| 免费黄网站欧美| 亚洲人成在线观看| 亚洲国产日韩欧美一区二区三区| 久久久久亚洲综合| 在线免费不卡视频| 欧美激情亚洲精品| 欧美激情一区二区| 亚洲午夜一区二区三区| 一区二区冒白浆视频| 国产精品视频xxx| 久久国产精品久久国产精品 | 亚洲欧洲日韩在线| 免费高清在线视频一区·| 久久人人爽人人| 91久久国产综合久久| 亚洲国产欧美日韩精品| 欧美日本亚洲| 午夜在线电影亚洲一区| 久久av免费一区| 91久久久亚洲精品| 一本大道久久a久久综合婷婷| 欧美日韩综合视频网址| 午夜精品久久久久久久99热浪潮| 亚洲免费在线视频| 亚洲大片免费看| 日韩亚洲欧美精品| 国产欧美一区二区精品忘忧草| 久久一综合视频| 欧美日韩八区| 久久久九九九九| 欧美va亚洲va香蕉在线| 亚洲小说欧美另类社区| 久久精品国产77777蜜臀| 一区二区三区日韩欧美精品| 亚洲综合视频一区| 亚洲黄色尤物视频| 亚洲一区视频| 亚洲三级色网| 欧美自拍偷拍午夜视频| 一区二区三区精密机械公司| 欧美在线视频免费| 夜夜嗨av一区二区三区四区| 欧美一级理论性理论a| 亚洲精品一二三| 久久精品免费观看| 亚洲男人第一av网站| 欧美成人a∨高清免费观看| 欧美一区二区三区视频免费播放| 蜜臀av性久久久久蜜臀aⅴ| 国产三级精品三级| 亚洲精品中文字幕在线观看| 精品动漫一区| 亚洲综合欧美日韩| 一区二区三区视频在线播放| 久久久久久久综合| 欧美一区二区三区四区夜夜大片 | 性欧美超级视频| 欧美高清视频在线| 老司机免费视频久久| 国产欧美一区二区精品秋霞影院 | 亚洲网站在线观看| 男女精品视频| 久久综合伊人| 国产午夜久久| 亚洲一级黄色片| 亚洲天堂av在线免费| 欧美女同视频| 亚洲精品一区二区三区在线观看| 亚洲国产高清一区二区三区| 欧美在线免费| 久久久最新网址| 国内免费精品永久在线视频| 欧美一区二区精美| 久久久99久久精品女同性| 国产欧美日韩视频一区二区三区| 99精品国产高清一区二区| 99re6热只有精品免费观看| 免费成年人欧美视频| 免费在线成人av| 亚洲电影一级黄| 久久综合中文色婷婷| 亚洲第一在线综合网站| 亚洲精品网址在线观看| 欧美精品免费看| 日韩西西人体444www| 亚洲欧美成aⅴ人在线观看| 国产精品久久久久国产a级| 亚洲天堂久久| 久久精品国产亚洲一区二区| 韩国三级电影一区二区| 久久综合给合久久狠狠色| 欧美激情按摩| 一本在线高清不卡dvd| 欧美四级在线观看| 性欧美精品高清| 欧美777四色影视在线| 亚洲免费久久| 国产一区二区av| 毛片一区二区| 一道本一区二区| 久久久久久亚洲综合影院红桃 | 亚洲国产精品久久久久| 夜夜精品视频一区二区| 国产欧美丝祙| 麻豆91精品91久久久的内涵| 亚洲理伦在线| 久久成人人人人精品欧| 亚洲欧洲精品一区二区三区不卡 | 亚洲欧美日韩精品久久久久| 性8sex亚洲区入口| 影音先锋中文字幕一区| 欧美精品在线播放| 午夜在线不卡| 亚洲精品乱码久久久久久蜜桃91| 欧美一区二区三区在| 亚洲国产精品久久精品怡红院| 欧美日韩一区二区三区免费看| 香蕉久久夜色精品国产使用方法| 欧美国产三区| 久久国产加勒比精品无码| 亚洲黄色成人久久久| 国产伦精品一区二区三| 免费在线日韩av| 午夜精品久久久久久久久久久久| 亚洲国产成人午夜在线一区| 性欧美大战久久久久久久免费观看| 精品福利av| 国产麻豆综合| 欧美日韩黄色一区二区| 久久久综合精品| 午夜精品影院在线观看| 亚洲三级电影在线观看| 男女av一区三区二区色多| 欧美一级理论性理论a| 亚洲精品乱码久久久久| 一区二区视频在线观看| 国产精品一二三| 欧美视频免费在线观看| 免费在线观看一区二区| 久久久久久久波多野高潮日日| 一区二区三区你懂的| 日韩视频久久| 亚洲精品国产视频| 欧美国产欧美亚州国产日韩mv天天看完整 | 亚洲欧洲日夜超级视频| 欧美国产日本韩|