日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

windows程序设计(第2版 王艳平)学习记要:3.2 线程同步

發布時間:2023/12/29 windows 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 windows程序设计(第2版 王艳平)学习记要:3.2 线程同步 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

線程同步的主要問題,在于需要解決不止一個線程同時執行某一段代碼,訪問同一個內存中的數據,臨界區對象就是為了解決這個問題,它是一個CRITICAL_SECYION結構,被windows內部使用這個結構記錄一些信息,確保同一時間只有一個線程訪問該數據段中的數據

臨界對象的代碼示例

/// // CriticalSection.cpp文件#include <stdio.h> #include <windows.h> #include <process.h>BOOL g_bContinue = TRUE; int g_nCount1 = 0; int g_nCount2 = 0; CRITICAL_SECTION g_cs; // 對存在同步問題的代碼段使用臨界區對象UINT __stdcall ThreadFunc(LPVOID);int main(int argc, char* argv[]) {UINT uId;HANDLE h[2];::InitializeCriticalSection(&g_cs); // 初始化臨界區對象,g_cs是一個LP指針,指向CRITICAL_SECTION結構h[0] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &uId);h[1] = (HANDLE)::_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &uId);// 等待1秒后通知兩個計數線程結束,關閉句柄Sleep(1000);g_bContinue = FALSE;::WaitForMultipleObjects(2, h, TRUE, INFINITE);::CloseHandle(h[0]);::CloseHandle(h[1]);// 刪除臨界區對象,臨界對象使用完后一定要刪除,以免內存泄漏::DeleteCriticalSection(&g_cs);printf("g_nCount1 = %d \n", g_nCount1);printf("g_nCount2 = %d \n", g_nCount2);return 0; }UINT __stdcall ThreadFunc(LPVOID) {while(g_bContinue){::EnterCriticalSection(&g_cs); //進入臨界對象,同一時間,只允許一個線程進入g_nCount1++;g_nCount2++;::LeaveCriticalSection(&g_cs); //離開臨界對象,表示臨界對象現在可以被其它線程進入}return 0; }
互鎖函數

互鎖函數的遠離比較簡單,基本規則是,它自增或者自減變量時,阻止其它線程同時使用該變量

事件內核對象

這東西主要用于線程之間互相通信,告知工作狀態和控制信號。比如事件對象就是用于這個范疇的

事件對象由CreatEvent創建

信號量內核對象

信號量允許超過一個以上的線程同時訪問一個資源,但是他有線程數量上限的限制

互斥內核對象

這玩意和臨界區對象最大的不同是它是內核對象,由系統管理,它可以跨越進程,臨界區不行,臨界區性能高資源占用少,互斥對象性能低,資源消耗大
http://blogold.chinaunix.net/u2/86649/showart.php?id=1672176

3.2.6 線程局部存儲

英文名稱TLS,和線程關聯的數據結構,可以利用其獲取線程的生命周期,不過老實說還是不太清楚這樣做的特殊意義,以后遇上了,再說吧

總結

以上是生活随笔為你收集整理的windows程序设计(第2版 王艳平)学习记要:3.2 线程同步的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。