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

信號量

  信號量是維護0到指定最大值之間的同步對象。信號量狀態在其計數大于0時是有信號的,而其計數是0時是無信號的。信號量對象在控制上可以支持有限數量共享資源的訪問。

  信號量的特點和用途可用下列幾句話定義:

  (1)如果當前資源的數量大于0,則信號量有效;

  (2)如果當前資源數量是0,則信號量無效;

  (3)系統決不允許當前資源的數量為負值;

  (4)當前資源數量決不能大于最大資源數量。

  創建信號量

HANDLE CreateSemaphore (
 PSECURITY_ATTRIBUTE psa,
 LONG lInitialCount, //開始時可供使用的資源數
 LONG lMaximumCount, //最大資源數
PCTSTR pszName);

  釋放信號量

  通過調用ReleaseSemaphore函數,線程就能夠對信標的當前資源數量進行遞增,該函數原型為:

BOOL WINAPI ReleaseSemaphore(
 HANDLE hSemaphore,
 LONG lReleaseCount, //信號量的當前資源數增加lReleaseCount
 LPLONG lpPreviousCount
);

  打開信號量

  和其他核心對象一樣,信號量也可以通過名字跨進程訪問,打開信號量的API為:

HANDLE OpenSemaphore (
 DWORD fdwAccess,
 BOOL bInherithandle,
 PCTSTR pszName
);

  互鎖訪問

  當必須以原子操作方式來修改單個值時,互鎖訪問函數是相當有用的。所謂原子訪問,是指線程在訪問資源時能夠確保所有其他線程都不在同一時間內訪問相同的資源。

  請看下列代碼:

int globalVar = 0;

DWORD WINAPI ThreadFunc1(LPVOID n)
{
 globalVar++;
 return 0;
}
DWORD WINAPI ThreadFunc2(LPVOID n)
{
 globalVar++;
 return 0;
}

  運行ThreadFunc1和ThreadFunc2線程,結果是不可預料的,因為globalVar++并不對應著一條機器指令,我們看看globalVar++的反匯編代碼:

00401038 mov eax,[globalVar (0042d3f0)]
0040103D add eax,1
00401040 mov [globalVar (0042d3f0)],eax

  在"mov eax,[globalVar (0042d3f0)]" 指令與"add eax,1" 指令以及"add eax,1" 指令與"mov [globalVar (0042d3f0)],eax"指令之間都可能發生線程切換,使得程序的執行后globalVar的結果不能確定。我們可以使用InterlockedExchangeAdd函數解決這個問題:

int globalVar = 0;

DWORD WINAPI ThreadFunc1(LPVOID n)
{
 InterlockedExchangeAdd(&globalVar,1);
 return 0;
}
DWORD WINAPI ThreadFunc2(LPVOID n)
{
 InterlockedExchangeAdd(&globalVar,1);
 return 0;
}

  InterlockedExchangeAdd保證對變量globalVar的訪問具有"原子性"。互鎖訪問的控制速度非常快,調用一個互鎖函數的CPU周期通常小于50,不需要進行用戶方式與內核方式的切換(該切換通常需要運行1000個CPU周期)。

  互鎖訪問函數的缺點在于其只能對單一變量進行原子訪問,如果要訪問的資源比較復雜,仍要使用臨界區或互斥。

  可等待定時器

  可等待定時器是在某個時間或按規定的間隔時間發出自己的信號通知的內核對象。它們通常用來在某個時間執行某個操作。

  創建可等待定時器

HANDLE CreateWaitableTimer(
 PSECURITY_ATTRISUTES psa,
 BOOL fManualReset,//人工重置或自動重置定時器
PCTSTR pszName);

  設置可等待定時器

  可等待定時器對象在非激活狀態下被創建,程序員應調用 SetWaitableTimer函數來界定定時器在何時被激活:

BOOL SetWaitableTimer(
 HANDLE hTimer, //要設置的定時器
 const LARGE_INTEGER *pDueTime, //指明定時器第一次激活的時間
 LONG lPeriod, //指明此后定時器應該間隔多長時間激活一次
 PTIMERAPCROUTINE pfnCompletionRoutine,
 PVOID PvArgToCompletionRoutine,
BOOL fResume);

  取消可等待定時器

BOOl Cancel WaitableTimer(
 HANDLE hTimer //要取消的定時器
);

  打開可等待定時器

  作為一種內核對象,WaitableTimer也可以被其他進程以名字打開:

HANDLE OpenWaitableTimer (
 DWORD fdwAccess,
 BOOL bInherithandle,
 PCTSTR pszName
);

  實例

  下面給出的一個程序可能發生死鎖現象:

#include <Windows.h>
#include <stdio.h>
CRITICAL_SECTION cs1, cs2;
long WINAPI ThreadFn(long);
main()
{
 long iThreadID;
 InitializeCriticalSection(&cs1);
 InitializeCriticalSection(&cs2);
 CloseHandle(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFn, NULL, 0,&iThreadID));
 while (TRUE)
 {
  EnterCriticalSection(&cs1);
  printf("\n線程1占用臨界區1");
  EnterCriticalSection(&cs2);
  printf("\n線程1占用臨界區2");

  printf("\n線程1占用兩個臨界區");

  LeaveCriticalSection(&cs2);
  LeaveCriticalSection(&cs1);

  printf("\n線程1釋放兩個臨界區");
  Sleep(20);
 };
 return (0);
}

long WINAPI ThreadFn(long lParam)
{
 while (TRUE)
 {
  EnterCriticalSection(&cs2);
  printf("\n線程2占用臨界區2");
  EnterCriticalSection(&cs1);
  printf("\n線程2占用臨界區1");

  printf("\n線程2占用兩個臨界區");

  LeaveCriticalSection(&cs1);
  LeaveCriticalSection(&cs2);

  printf("\n線程2釋放兩個臨界區");
  Sleep(20);
 };
}

  運行這個程序,在中途一旦發生這樣的輸出:

  線程1占用臨界區1

  線程2占用臨界區2

  或

  線程2占用臨界區2

  線程1占用臨界區1

  或

  線程1占用臨界區2

  線程2占用臨界區1

  或

  線程2占用臨界區1

  線程1占用臨界區2

  程序就"死"掉了,再也運行不下去。因為這樣的輸出,意味著兩個線程相互等待對方釋放臨界區,也即出現了死鎖。

  如果我們將線程2的控制函數改為:

long WINAPI ThreadFn(long lParam)
{
 while (TRUE)
 {
  EnterCriticalSection(&cs1);
  printf("\n線程2占用臨界區1");
  EnterCriticalSection(&cs2);
  printf("\n線程2占用臨界區2");

  printf("\n線程2占用兩個臨界區");

  LeaveCriticalSection(&cs1);
  LeaveCriticalSection(&cs2);

  printf("\n線程2釋放兩個臨界區");
  Sleep(20);
 };
}

  再次運行程序,死鎖被消除,程序不再擋掉。這是因為我們改變了線程2中獲得臨界區1、2的順序,消除了線程1、2相互等待資源的可能性。

  由此我們得出結論,在使用線程間的同步機制時,要特別留心死鎖的發生。
Posted on 2005-12-30 18:51 艾凡赫 閱讀(1154) 評論(3)  編輯 收藏 引用 所屬分類: 多線程

Feedback

# re: Win32多線程程序設計之線程通信 (三)  回復  更多評論   

2006-03-13 09:44 by kx
哥們,寫得太好了

# re: Win32多線程程序設計之線程通信 (三)  回復  更多評論   

2006-03-14 10:00 by 愛飯盒
哥們,不好意思是轉載的

# re: Win32多線程程序設計之線程通信 (三)  回復  更多評論   

2009-07-14 14:59 by brightcoder
即使是轉載的,寫的也好!支持!
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            免费成人你懂的| 国产亚洲精品资源在线26u| 在线亚洲一区二区| 一区二区高清视频| 一本色道久久88亚洲综合88| 日韩视频一区| 99re亚洲国产精品| 午夜精品一区二区三区在线播放| 亚洲影音一区| 久久国内精品自在自线400部| 欧美一区二区成人| 久久精品欧洲| 欧美精品偷拍| 国产欧美精品一区二区色综合 | 欧美专区中文字幕| 欧美在线亚洲在线| 欧美岛国在线观看| 99视频+国产日韩欧美| 亚洲综合色婷婷| 久久人人爽人人| 欧美视频一区二区三区四区| 国产精品免费福利| 在线观看国产精品网站| 99热精品在线| 亚洲欧美一区二区三区久久| 亚洲免费视频网站| 你懂的视频一区二区| 亚洲国产日韩欧美在线图片| 日韩一级免费观看| 久久精品国产一区二区三区 | 久久久久青草大香线综合精品| 免费一区视频| 国产精品亚洲综合| 日韩一级网站| 免费在线播放第一区高清av| 亚洲乱码国产乱码精品精可以看 | 这里只有视频精品| 麻豆freexxxx性91精品| 一本色道久久综合精品竹菊| 久久亚洲不卡| 国产视频一区二区三区在线观看| 亚洲国产欧美一区二区三区同亚洲| 亚洲永久网站| 亚洲精品中文字幕在线| 欧美不卡高清| 亚洲国产日韩在线| 免费成人毛片| 久久久久久夜精品精品免费| 国产伦精品一区二区三区视频孕妇| a4yy欧美一区二区三区| 欧美激情一区二区三区成人| 欧美在现视频| 国内精品久久久久久影视8| 欧美伊人久久大香线蕉综合69| 亚洲毛片网站| 欧美日韩国产另类不卡| 日韩视频一区二区三区在线播放| 欧美a级片网站| 美女图片一区二区| 亚洲精品乱码久久久久久蜜桃91 | 日韩午夜精品| 亚洲黄页视频免费观看| 欧美国产视频在线| 99re6这里只有精品| 91久久精品国产91性色tv| 欧美sm视频| 一本大道久久a久久综合婷婷| 亚洲韩国精品一区| 欧美激情精品久久久久久蜜臀| 亚洲精品女av网站| 99视频超级精品| 国产伦理一区| 欧美成人一品| 欧美日韩亚洲一区二区三区在线观看| 99精品久久免费看蜜臀剧情介绍| 欧美精品一区二区三区久久久竹菊| 日韩午夜三级在线| 亚洲精品欧美| 欧美日韩亚洲综合| 欧美一区二区三区免费观看| 午夜国产欧美理论在线播放| 激情综合色综合久久| 欧美激情a∨在线视频播放| 欧美激情精品久久久久久久变态| 在线视频精品一区| 午夜精品久久久久久99热| 在线免费观看视频一区| 亚洲精品久久久久久下一站| 国产精品一卡二| 欧美黄在线观看| 国产精品视频福利| 欧美国产日本韩| 国产精品一级二级三级| 欧美成人亚洲| 国产九区一区在线| 欧美激情一区二区三区| 国产精品理论片在线观看| 欧美激情第五页| 国产午夜精品久久久久久免费视| 欧美国产视频日韩| 国产欧美一区二区色老头| 亚洲经典自拍| 激情文学一区| 亚洲免费影院| 亚洲乱码国产乱码精品精98午夜| 亚洲欧美中文另类| 一区二区三区视频免费在线观看| 久久成人免费网| 亚洲欧美日韩中文视频| 欧美成人精品激情在线观看| 欧美一区激情视频在线观看| 欧美成人午夜免费视在线看片 | 欧美sm视频| 国产欧美日韩麻豆91| 亚洲伦伦在线| 日韩一级网站| 欧美14一18处毛片| 久久夜色精品亚洲噜噜国产mv | 国产一区二区三区电影在线观看| 亚洲精品一区中文| 最新日韩在线| 噜噜噜91成人网| 久久人人爽人人爽爽久久| 国产精品丝袜xxxxxxx| 日韩亚洲欧美综合| 99国产精品国产精品毛片| 欧美丰满高潮xxxx喷水动漫| 欧美va亚洲va国产综合| 韩国av一区二区三区四区| 午夜视频一区| 久久av一区二区三区漫画| 国产精品一二三四区| 午夜欧美不卡精品aaaaa| 欧美一级久久久| 国产精品五月天| 亚洲欧美激情一区| 欧美一区二区日韩一区二区| 国产精品久久久久国产精品日日 | 性色av一区二区三区在线观看| 亚洲精品一级| 老牛国产精品一区的观看方式| 久久精品成人一区二区三区| 国产精品视频九色porn| 亚洲一区中文| 欧美一级大片在线免费观看| 国产伦精品一区二区三区高清版 | 国产精品久久一级| 一区二区三区日韩在线观看| 亚洲一区二区三区激情| 国产精品福利久久久| 亚洲一区网站| 久久精品国产欧美亚洲人人爽| 国产欧美精品在线观看| 久久久精品日韩欧美| 欧美激情精品| 亚洲视频精选在线| 国产精品一级久久久| 久久久久这里只有精品| 亚洲国产欧美一区二区三区丁香婷| 最近中文字幕日韩精品| 欧美日韩在线高清| 欧美一级理论片| 欧美国产日韩视频| 中文精品视频一区二区在线观看| 国产精品成人观看视频免费 | 久久综合久久综合九色| 亚洲国产精品免费| 国产精品v欧美精品v日韩精品 | 欧美三级乱码| 久久精品一区二区三区不卡| 亚洲国产精品综合| 欧美一二三视频| 亚洲黄色成人网| 国产精品久久久久三级| 久久这里有精品视频| 一区二区毛片| 欧美二区不卡| 欧美一区二区三区婷婷月色| 亚洲国产合集| 国产精品综合久久久| 欧美精品九九| 久久深夜福利| 午夜宅男久久久| 日韩午夜在线| 亚洲高清不卡在线观看| 久久久久久久网| 亚洲自拍偷拍色片视频| 亚洲日本免费| 狠狠久久五月精品中文字幕| 欧美视频不卡| 欧美经典一区二区三区| 久久精品亚洲国产奇米99| 亚洲视频欧洲视频| 亚洲免费高清| 亚洲欧洲在线免费| 欧美国产一区在线| 欧美a级理论片| 欧美fxxxxxx另类| 老色鬼精品视频在线观看播放| 亚洲欧美在线另类|