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

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

偶爾來(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>
            亚洲国产免费看| 国产在线拍揄自揄视频不卡99| 影音先锋成人资源站| 男女精品网站| 农村妇女精品| 国产精品99久久久久久www| 这里只有精品电影| 国产精品亚洲成人| 美女视频一区免费观看| 欧美成人一区二区三区在线观看 | 欧美成人综合网站| 中文欧美在线视频| 欧美亚洲免费电影| 日韩视频在线免费观看| 9i看片成人免费高清| 国产一区视频网站| 亚洲国产成人久久综合| 欧美日韩中字| 老鸭窝亚洲一区二区三区| 欧美黄色小视频| 欧美一区二区私人影院日本 | 久久精品在这里| 99re66热这里只有精品4| 午夜久久久久久久久久一区二区| 有码中文亚洲精品| 中文网丁香综合网| 91久久精品国产91久久性色tv | 欧美中文字幕在线| 欧美激情在线狂野欧美精品| 欧美一区91| 欧美日韩理论| 欧美激情成人在线| 国产欧美一区二区三区久久人妖| 亚洲成人资源网| 国产一区二区三区观看| 欧美一区二区三区的| 午夜精品理论片| 另类av导航| 久久久久久久成人| 国产精品日本| 日韩午夜免费视频| 最新国产精品拍自在线播放| 午夜视频在线观看一区| 亚洲自啪免费| 欧美日韩亚洲一区三区| 亚洲高清不卡在线观看| 在线看欧美日韩| 久久精品最新地址| 久久久久久久久久久久久9999| 欧美日韩一区二区三区在线观看免 | 国产精品美女久久| 亚洲精品九九| 亚洲精品国精品久久99热一| 久久高清福利视频| 久久亚洲色图| 国内精品国语自产拍在线观看| 亚洲欧美国产一区二区三区| 亚洲一区二区免费| 欧美网站在线| 亚洲一区二区欧美日韩| 亚洲免费视频在线观看| 欧美先锋影音| 亚洲一区二区三区视频| 午夜欧美精品久久久久久久| 国产精品日本| 欧美在线不卡视频| 麻豆av福利av久久av| 在线播放亚洲一区| 欧美xx69| 一区二区三区高清不卡| 亚洲欧美卡通另类91av| 国产精品一国产精品k频道56| 亚洲一区二区三区四区五区黄| 亚洲欧美日韩国产成人| 国产日韩一区二区三区在线| 久久精品成人欧美大片古装| 欧美大胆a视频| 一本久久a久久免费精品不卡| 欧美日本一道本在线视频| 一区二区三区高清在线| 久久国产免费看| 在线观看国产精品淫| 欧美激情在线播放| 亚洲欧美成人一区二区三区| 久久亚洲精品欧美| 99精品久久久| 国产精品专区一| 美日韩精品视频| 一本色道久久综合亚洲精品不卡| 欧美一区二区三区免费视| 在线精品观看| 国产精品福利片| 久久综合狠狠综合久久综青草| 亚洲卡通欧美制服中文| 久久av在线看| 一区二区冒白浆视频| 国产欧美亚洲日本| 欧美高清在线播放| 欧美在线观看www| 亚洲精品国产拍免费91在线| 久久丁香综合五月国产三级网站| 最近中文字幕日韩精品| 国产精品亚洲精品| 中文在线不卡视频| 日韩午夜电影| 国产午夜精品一区二区三区视频| 免费欧美在线视频| 欧美在线免费| 在线视频亚洲| 亚洲激情视频网站| 久久久综合香蕉尹人综合网| 亚洲天堂成人| 亚洲日本aⅴ片在线观看香蕉| 国产欧美精品xxxx另类| 欧美日韩aaaaa| 女人天堂亚洲aⅴ在线观看| 欧美一区二区三区在线观看视频| 亚洲精品美女91| 欧美国产先锋| 免费成年人欧美视频| 欧美伊人影院| 亚洲欧美在线播放| 亚洲视频电影在线| 日韩一区二区精品视频| 91久久精品国产91性色| 在线免费不卡视频| 黄色精品一区| 好看的av在线不卡观看| 国产视频观看一区| 国产噜噜噜噜噜久久久久久久久| 欧美日韩福利| 欧美区亚洲区| 欧美日本免费| 欧美日韩一区二区三区免费看| 欧美超级免费视 在线| 牛夜精品久久久久久久99黑人| 久久久噜噜噜| 免费精品视频| 欧美成人免费网| 欧美乱妇高清无乱码| 欧美精品七区| 欧美日韩一区三区| 国产精品久久久一区麻豆最新章节 | 免费在线播放第一区高清av| 久久久福利视频| 久久久视频精品| 鲁鲁狠狠狠7777一区二区| 女人天堂亚洲aⅴ在线观看| 免费观看成人www动漫视频| 久久综合一区| 亚洲国产精品www| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲激情网站| 亚洲午夜电影网| 亚欧成人精品| 欧美www在线| 欧美午夜大胆人体| 国产麻豆午夜三级精品| 国产综合网站| 日韩视频在线一区二区| 亚洲欧美日韩精品在线| 久久蜜臀精品av| 亚洲第一天堂无码专区| 一本色道久久88亚洲综合88| 亚洲专区免费| 男人插女人欧美| 国产精品红桃| 亚洲大胆av| 中日韩视频在线观看| 久久精品一区蜜桃臀影院| 欧美成人资源| 亚洲影院色无极综合| 久久综合一区二区| 国产精品免费观看在线| 影音先锋久久资源网| 亚洲图片欧洲图片日韩av| 久久久亚洲午夜电影| 亚洲毛片在线看| 久久国产加勒比精品无码| 欧美人交a欧美精品| 国产一区二区中文| 中国女人久久久| 免费不卡视频| 欧美日韩亚洲网| 亚洲精选成人| 久久久久成人精品| 亚洲日韩欧美视频一区| 欧美亚洲午夜视频在线观看| 欧美激情一区二区三区成人| 国产三区二区一区久久| 在线中文字幕一区| 欧美激情精品久久久久久黑人| 亚洲一级黄色片| 欧美精品福利视频| 亚洲第一免费播放区| 久久激情一区| 亚洲在线不卡| 国产精品黄页免费高清在线观看| 亚洲三级色网| 欧美激情视频一区二区三区在线播放 |