當(dāng)前位置:
首頁 >
Windows编程-- 用户方式中线程的同步---关键代码段(临界区)
發(fā)布時(shí)間:2025/5/22
48
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Windows编程-- 用户方式中线程的同步---关键代码段(临界区)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
可以從例子學(xué)習(xí),更好的掌握
?
#include <windows.h>#include <iostream.h>
//兩個(gè)線程的聲明
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
int tickets = 100;
CRITICAL_SECTION g_cs; //定義一個(gè)臨界區(qū)
int main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0, Fun1Proc, NULL,0, NULL);
hThread2=CreateThread(NULL,0, Fun2Proc, NULL,0, NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
InitializeCriticalSection(&g_cs); //初始化臨界區(qū)
Sleep(4000);
DeleteCriticalSection(&g_cs); //當(dāng)臨界區(qū)里沒有資源時(shí)釋放掉臨界區(qū)(可以這樣說嗎)???
return 0;
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
while (TRUE)
{
EnterCriticalSection(&g_cs); //該線程進(jìn)入臨界區(qū)
if (tickets > 0)
{
Sleep( 1);
cout<< "Thread1 sell tickets:"<< tickets-- << endl;
}
else
{
break;
}
LeaveCriticalSection(&g_cs); //退出臨界區(qū)
}
return0;
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_cs); //該線程進(jìn)入臨界區(qū)
if(tickets > 0)
{
Sleep( 1);
cout<< "Thread2 sell tickets:"<< tickets-- << endl;
}
else
{
break;
}
LeaveCriticalSection(&g_cs); //退出臨界區(qū)
}
return 0;
}
?
?
?
?應(yīng)該注意的:
1 關(guān)鍵代碼段(臨界區(qū))工作在用 用戶方式下
2 關(guān)鍵代碼段(臨界區(qū))是指一個(gè)小代碼段,在代碼夠執(zhí)行前。它必須獨(dú)占對某些資源的訪問權(quán)。
3 關(guān)鍵代碼段是工作在用戶方式下。同步速度較快,但在使用關(guān)鍵代碼段時(shí),很容易進(jìn)入死鎖狀態(tài)。因?yàn)樵诘却M(jìn)入關(guān)鍵代碼段時(shí)無法設(shè)定超時(shí)值。
4 線程死鎖?線程1擁有了臨界區(qū)對象A。等待臨界區(qū)對象B的擁有權(quán)。線程2擁有了臨界區(qū)對象B,等待臨界區(qū)對象A的擁有權(quán),就造成了死鎖。
5 無法用它們對多個(gè)進(jìn)程中的各個(gè)線程進(jìn)行同步?
?
以下的例子就是進(jìn)入了死鎖。?
#include <windows.h>
#include <iostream.h>
//1、兩個(gè)線程的聲明
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
int tickets = 100;
CRITICAL_SECTION g_csA; //2、定義兩個(gè)臨界區(qū)
CRITICAL_SECTION g_csB;
int main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0, Fun1Proc, NULL,0, NULL);
hThread2=CreateThread(NULL,0, Fun2Proc, NULL,0, NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
InitializeCriticalSection(&g_csA); //3、初始化臨界區(qū)
InitializeCriticalSection(&g_csB);
Sleep(4000);
DeleteCriticalSection(&g_csA); //4、當(dāng)臨界區(qū)里沒有資源時(shí)釋放掉臨界區(qū)
DeleteCriticalSection(&g_csB);
return 0;
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
// 11、兩個(gè)臨界區(qū)和兩個(gè)線程會形成死機(jī)。線程在等待無法進(jìn)入臨界區(qū)g_csB。線程在等待無法進(jìn)入臨界區(qū)g_csA
while (TRUE)
{
EnterCriticalSection(&g_csA); //5、該線程進(jìn)入臨界區(qū)g_csA
Sleep(1); //6、線程進(jìn)入睡眠狀態(tài) 線程時(shí)間片斷結(jié)束線程開始
EnterCriticalSection(&g_csB); //9、線程進(jìn)入臨界區(qū)g_csB,但是臨界區(qū)g_csB已被線程占用故只能等待時(shí)間片斷交給線程
if (tickets > 0)
{
Sleep( 1);
cout<< "Thread1 sell tickets:"<< tickets-- << endl;
}
else
{
break;
}
LeaveCriticalSection(&g_csB); //退出臨界區(qū)
LeaveCriticalSection(&g_csA);
}
return 0;
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_csB); //7、線程進(jìn)入臨界區(qū)g_csB
Sleep(1); //8、線程進(jìn)入睡眠狀態(tài)線程時(shí)間片斷結(jié)束線程開始
EnterCriticalSection(&g_csA); //10、線程進(jìn)入臨界區(qū)g_csA 但是臨界區(qū)g_csA已被線程占用故只能等待時(shí)間片斷交給線程
if(tickets > 0)
{
Sleep( 1);
cout<< "Thread2 sell tickets:"<< tickets-- << endl;
}
else
{
break;
}
LeaveCriticalSection(&g_csA);
LeaveCriticalSection(&g_csB); //退出臨界區(qū)
}
return 0;
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/fangshenghui/archive/2011/01/05/1926396.html
總結(jié)
以上是生活随笔為你收集整理的Windows编程-- 用户方式中线程的同步---关键代码段(临界区)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Fiddler解析WCF RIA S
- 下一篇: PE格式详细讲解1 - 系统篇01|解密