<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 事件對象 event對象常用來多個線程間進行工作的同步,如線程A先執行一些初始化工作,觸發evnet,通知線程B初始化工作已經完成,可以進行接下來的工作。 ### 創建event對象 ~~~ HANDLE WINAPI CreateEvent( _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes, // 設置安全屬性 _In_ BOOL bManualReset, // 是否人工重置狀態(人工重置則不會自動改變事件狀態, 自動重置則會自動將事件恢復為未觸發) _In_ BOOL bInitialState, // 事件初始狀態(觸發/未觸發) _In_opt_ LPCTSTR lpName // 事件名稱 ); ~~~ 值得注意的是 ~~~ <span style="color:#FF0000;">BOOL bManualReset, </span> ~~~ 若 為人工重置,那么當事件觸發時,所有等待線程均能夠獲得事件對象,且不會自動重置事件狀態。若為自動重置,則僅有一個線程wait獲得該事件,同時置事件為未觸發狀態。 另外一點,其他線程若想獲得該事件對象句柄,可以也調用CreateEvent函數,并傳入事件名稱。若該事件已經存在,則直接返回句柄,若未存在則會創建該事件并返回句柄。 注意,若事件已經存在,再調用CreateEvent只會獲取其句柄,但該函數的其他參數會忽略。 對于自動重置事件,若multiplewait函數為全部等待狀態,則對于僅自動重置事件觸發時,multiplewait函數會忽略該event,同時不會重置事件,只有當所有的等待對象都觸發時,multiplewait才會獲取自動重置事件并自動重置為未觸發狀態。 **若想在創建事件時指定的可以訪問事件的權限,可以用** ~~~ HANDLE WINAPI CreateEventEx( _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes, _In_opt_ LPCTSTR lpName, _In_ DWORD dwFlags, // 可以是兩種flags的任意組合<strong>CREATE_EVENT_INITIAL_SET</strong>、<strong>CREATE_EVENT_MANUAL_RESET</strong> _In_ DWORD dwDesiredAccess // 設置事件權限 ); ~~~ ### 獲取事件句柄函數 ~~~ HANDLE WINAPI OpenEvent( _In_ DWORD dwDesiredAccess, _In_ BOOL bInheritHandle, _In_ LPCTSTR lpName ); ~~~ ### 改變事件觸發狀態 ### 設置事件為觸發狀態 ~~~ BOOL WINAPI SetEvent( _In_ HANDLE hEvent ); ~~~ ### 設置事件未觸發狀態 ~~~ BOOL WINAPI ResetEvent( _In_ HANDLE hEvent ); ~~~ ## 可等待計時器內核對象 可等待計時器對象會在一定時后或每間隔一段時間觸發,可用在某個時間的操作。 ### 創建或獲取可等待計時器 ~~~ HANDLE WINAPI CreateWaitableTimer( _In_opt_ LPSECURITY_ATTRIBUTES lpTimerAttributes, _In_ BOOL bManualReset, // 是否人工重置 _In_opt_ LPCTSTR lpTimerName ); ~~~ ### 獲取可等待計時器句柄 ~~~ HANDLE WINAPI OpenWaitableTimer( _In_ DWORD dwDesiredAccess, _In_ BOOL bInheritHandle, _In_ LPCTSTR lpTimerName ); ~~~ 不像事件對象,可等待計時器創建后總是未觸發的。 需要調用函數 SetWaitableTimer ~~~ BOOL WINAPI SetWaitableTimer( _In_ HANDLE hTimer, // 計時等待對象 _In_ const LARGE_INTEGER *pDueTime, // 何時觸發對象(用負值表示相對于調用SetWaitableTimer后的時間 100納秒為單位) _In_ LONG lPeriod, // 觸發后間隔的觸發頻率(0 表示僅觸發一次) _In_opt_ PTIMERAPCROUTINE pfnCompletionRoutine, // APC調用函數 _In_opt_ LPVOID lpArgToCompletionRoutine, // APC調用參數 _In_ BOOL fResume // 在可掛起的計算機系統中,是否恢復計算機來使等待線程執行CPU時間。 // 若傳入FALSE,則會觸發對象,但等待線程不會執行,除非直到計算機系統重新執行 ); ~~~ ### 取消計時等待對象的時間設置 ~~~ 該函數會取消一切的SetWaitableTimer的計時設置。 <strong>但是該函數不會更改timer對象的觸發狀態</strong>,若已經觸發,則該對象仍會處于觸發狀態。 BOOL WINAPI CancelWaitableTimer( _In_ HANDLE hTimer ); ~~~ ### 計時等待對象 VS 用戶計時器(SetTimer) 1、內核對象,用戶對象 2、用戶計時器會產生WM_TIMER消息,該消息會被送到調用SetTimer線程或創建窗口線程,同一時間僅有一個線程得到通知。 計時等待對象可多個線程同時被通知。 ## 信號量內核對象 信號能夠靈活的限制可被激活的線程數目,并確保線程數目不會超過設定的最大值。 具體使用流程為: 1、創建信號量對象,并指定最大資源數目與當前可用數目(常為0)。 2、創建多個資源請求線程,因為當前可用數目為0,線程等待。 3、當符合某種條件時,調用[**ReleaseSemaphore**](https://msdn.microsoft.com/en-us/library/windows/desktop/ms685071%28v=vs.85%29.aspx)函數釋放資源,這時候可用資源數目遞增。 4、可以資源數目不再為0,等待線程獲得資源,同時可以資源數目遞減。 windows系統會確保當前可用資源數目大于等于0,同時不會超過最大值。 ### 創建(或獲取)信號量對象 ~~~ HANDLE WINAPI CreateSemaphore( _In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, _In_ LONG lInitialCount, // 初始當前可用資源數目 _In_ LONG lMaximumCount, // 最大可用資源數目 _In_opt_ LPCTSTR lpName ); ~~~ [**CreateSemaphoreEx**](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682446%28v=vs.85%29.aspx) ### 獲取信號量對象句柄 ~~~ HANDLE WINAPI OpenSemaphore( _In_ DWORD dwDesiredAccess, _In_ BOOL bInheritHandle, _In_ LPCTSTR lpName ); ~~~ ### 遞增信號量可用資源 ~~~ BOOL WINAPI ReleaseSemaphore( _In_ HANDLE hSemaphore, _In_ LONG lReleaseCount, _Out_opt_ LPLONG lpPreviousCount ); ~~~ ## 互斥量內核對象 互斥量內核對象用于確保資源被唯一的線程訪問,即互斥訪問。 ### 創建(獲取)互斥量對象 ~~~ HANDLE WINAPI CreateMutex( _In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes, _In_ BOOL bInitialOwner, _In_opt_ LPCTSTR lpName ); ~~~ 互斥量內核對象 有 引用計數器,線程ID已經遞歸計數器組成。 線程ID用來記錄當前獲取互斥量對象的線程ID,0表示沒人獲取,互斥量處于觸發狀態。一旦,有個線程wait到互斥量,其內核對象線程ID為該線程ID,同時內核對象變為未觸發狀態,其他線程只能繼續等待。但對于已經獲得互斥量線程,其仍可以等待成功,這時候內核對象會遞增其遞歸計數器。 調用[**ReleaseMutex**](https://msdn.microsoft.com/en-us/library/windows/desktop/ms685066%28v=vs.85%29.aspx) 釋放互斥量。對于多次遞歸進入的互斥量,要相應的多次調用release函數。 注意,當線程在獲取了互斥量對象,而在調用[**ReleaseMutex**](https://msdn.microsoft.com/en-us/library/windows/desktop/ms685066%28v=vs.85%29.aspx)之前結束的話,會產生遺棄問題。 ## 關于內核態同步對象的一些事項 1、一般的,通過內核對象來進行同步,其獲取的內核對象句柄都是具有所有權限的(訪問,改變觸發狀態等),但是我們可以在Create內核對象時,通過擴展函數ex函數設置可訪問權限,那么當訪問該內核對象句柄時,僅能夠進行指定的權限訪問。 2、內核對象命名與多用戶系統 我們有多種方法可以在多個進程空間訪問同一個內核對象(繼承,dumplicatehandle,命名的內核對象)。 在使用命名內核對象訪問時,需要注意在多用戶系統中內核對象名稱的前綴。 MSDN原話是: The name can have a "Global\" or "Local\" prefix to explicitly create the object in the global or session namespace. 即加上“Global\”前綴,可以在多個用戶間通過名稱訪問該內核對象,而"Local\"前綴僅能夠當前用戶通過名稱訪問內核對象。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看