博主介紹:?全網(wǎng)粉絲喜愛+、前后端領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、本質(zhì)互聯(lián)網(wǎng)精神、堅持優(yōu)質(zhì)作品共享、掘金/騰訊云/阿里云等平臺優(yōu)質(zhì)作者、擅長前后端項目開發(fā)和畢業(yè)項目實(shí)戰(zhàn)?有需要可以聯(lián)系作者我哦!
??附上相關(guān)C語言版源碼講解??
???? 精彩專欄推薦訂閱???? 不然下次找不到喲
一、同步與互斥概念
操作系統(tǒng)中的同步和互斥操作是指處理多個任務(wù)或進(jìn)程時的不同方式。多個線程訪問共享數(shù)據(jù)時,使用互斥鎖可以確保在任意時刻只有一個線程能夠修改數(shù)據(jù),防止數(shù)據(jù)不一致。
同步定義: 同步是指多個任務(wù)或進(jìn)程按照一定的順序執(zhí)行,以確保它們之間的關(guān)系和協(xié)調(diào)。
關(guān)鍵點(diǎn):
- 協(xié)調(diào)執(zhí)行: 任務(wù)按照一定的規(guī)則或條件順序執(zhí)行,以避免不確定的結(jié)果。
- 等待機(jī)制: 在同步環(huán)境中,一個任務(wù)的執(zhí)行可能需要等待其他任務(wù)的完成或滿足特定條件。
互斥定義: 互斥是指在同一時刻只允許一個任務(wù)或進(jìn)程訪問共享資源,以防止數(shù)據(jù)競爭和一致性問題。
關(guān)鍵點(diǎn):
- 獨(dú)占資源: 一次只有一個任務(wù)能夠訪問臨界區(qū)(共享資源的代碼段)。
- 互斥鎖: 通常使用互斥鎖等機(jī)制來保護(hù)共享資源,確保只有一個任務(wù)能夠持有鎖并訪問資源。
二、算法
#include <windows.h>
#include <iostream>
#include<stdio.h>
bool g_continue = true; //控制程序結(jié)束
HANDLE g_hS; //當(dāng)盤子為空時的線程
HANDLE g_hS0; //當(dāng)盤子中放的是桔子線程
HANDLE g_hS1; //當(dāng)盤子中放的是蘋果線程
DWORD WINAPI father(LPVOID); //定義父親線程
DWORD WINAPI son(LPVOID); //定義兒子線程
DWORD WINAPI daughter(LPVOID);//定義女兒線程
int main()
{
//創(chuàng)建各個互斥與資源信號量
g_hS = CreateSemaphore(NULL,1,1,NULL); //盤子中是否有水果
g_hS0 = CreateSemaphore(NULL,0,1,NULL); //盤子中的水果為桔子
g_hS1 = CreateSemaphore(NULL,0,1,NULL); //盤子中的水果為蘋果
//其中第2和3個參數(shù)為信號量的初始值和最大值
const unsigned short father_COUNT = 0; //聲明父親
const unsigned short son_COUNT = 0; //聲明兒子
const unsigned short daughter_COUNT = 0;//聲明女兒
//總的線程數(shù)
const unsigned short THREADS_COUNT = father_COUNT+son_COUNT+daughter_COUNT ;
HANDLE hThreads[THREADS_COUNT]; //各線程的handle
DWORD fatherID[father_COUNT]; //父親線程的標(biāo)識符
DWORD sonID[son_COUNT]; //兒子線程的標(biāo)識符
DWORD daughterID[daughter_COUNT]; //女兒線程的標(biāo)識符
//創(chuàng)建父親進(jìn)程
hThreads[0]=CreateThread(NULL,0,father,NULL,0,&fatherID[0]);
if (hThreads[0]==NULL) return -1;
//創(chuàng)建兒子進(jìn)程
hThreads[1]=CreateThread(NULL,0,son,NULL,0,&sonID[0]);
if (hThreads[1]==NULL) return -1;
//創(chuàng)建女兒進(jìn)程
hThreads[2]=CreateThread(NULL,0,daughter,NULL,0,&daughterID[0]);
if (hThreads[2]==NULL) return -1;
while(g_continue){
if(getchar()){ //按回車后終止程序運(yùn)行
g_continue = false;
}
}
return 0;
}
//父親放水果的操作,輸出
void eat()
{
std::cerr << "兒子吃桔子" << std::endl;
}
void eat1()
{
std::cerr << "女兒吃蘋果" << std::endl;
}
//父親進(jìn)程
DWORD WINAPI father(LPVOID lpPara)
{
while(g_continue){
WaitForSingleObject(g_hS,INFINITE);
int juzhi=rand()%2; //設(shè)置了一個隨機(jī)數(shù),來模擬父親放的是什么水果
Sleep(1500);//方便觀察實(shí)驗結(jié)果
if(juzhi==1){
printf("父親放入了一個桔子\n");
Sleep(1000);
ReleaseSemaphore(g_hS0,1,NULL);
}
else{
printf("父親放入了一個蘋果\n");
Sleep(1000);
ReleaseSemaphore(g_hS1,1,NULL);
}
}
return 0;
}
//兒子進(jìn)程
DWORD WINAPI son(LPVOID lpPara)
{
while(g_continue){
WaitForSingleObject(g_hS0,INFINITE);
eat();
Sleep(1500);
ReleaseSemaphore(g_hS,1,NULL);
}
return 0;
}
//女兒進(jìn)程
DWORD WINAPI daughter(LPVOID lpPara)
{
while(g_continue){
WaitForSingleObject(g_hS1,INFINITE);
eat1();
Sleep(1500);
ReleaseSemaphore(g_hS,1,NULL);
}
return 0;
}
執(zhí)行結(jié)果
三、總結(jié)
同步的應(yīng)用:
-
線程同步: 在多線程編程中,同步用于協(xié)調(diào)多個線程的執(zhí)行,確保它們按照一定的順序執(zhí)行或等待某些條件滿足后再繼續(xù)執(zhí)行。
-
協(xié)同任務(wù): 同步可以用于協(xié)同任務(wù)的執(zhí)行,確保任務(wù)之間的依賴關(guān)系和順序。
-
異步編程: 同步機(jī)制常用于異步編程中,確保異步任務(wù)的正確執(zhí)行順序。
-
GUI應(yīng)用: 在圖形用戶界面(GUI)應(yīng)用中,同步用于處理用戶界面的響應(yīng)和更新,以保持用戶體驗。
-
網(wǎng)絡(luò)通信: 同步操作常用于等待網(wǎng)絡(luò)數(shù)據(jù)的到達(dá)或發(fā)送數(shù)據(jù)后等待確認(rèn)。
互斥的應(yīng)用:
-
共享資源保護(hù): 互斥機(jī)制用于保護(hù)共享資源,防止多個線程或進(jìn)程同時訪問導(dǎo)致數(shù)據(jù)不一致性或競態(tài)條件。
-
臨界區(qū)保護(hù): 互斥鎖用于保護(hù)臨界區(qū),確保在任意時刻只有一個線程能夠執(zhí)行臨界區(qū)的代碼。
-
文件操作: 互斥可以用于文件讀寫操作,以確保在寫操作進(jìn)行時不會發(fā)生讀操作,反之亦然。
-
數(shù)據(jù)庫訪問: 在數(shù)據(jù)庫應(yīng)用中,互斥用于保護(hù)對數(shù)據(jù)庫的訪問,以防止并發(fā)訪問導(dǎo)致數(shù)據(jù)不一致。
-
資源分配: 互斥可以用于保護(hù)對有限資源的訪問,如線程池中的線程對任務(wù)的分配。
綜合應(yīng)用:
-
生產(chǎn)者-消費(fèi)者問題: 使用同步和互斥來解決生產(chǎn)者和消費(fèi)者之間的數(shù)據(jù)共享和協(xié)調(diào)問題。
-
讀寫鎖: 讀寫鎖結(jié)合了同步和互斥的特性,允許多個線程同時讀取共享數(shù)據(jù),但在寫操作時進(jìn)行互斥。
-
定時任務(wù)調(diào)度: 同步和互斥可以用于定時任務(wù)的調(diào)度,確保任務(wù)在指定時間執(zhí)行。文章來源:http://www.zghlxwxcb.cn/news/detail-817127.html
-
并行計算: 在并行計算中,同步和互斥用于協(xié)調(diào)和保護(hù)多個計算單元的執(zhí)行。文章來源地址http://www.zghlxwxcb.cn/news/detail-817127.html
大家點(diǎn)贊、收藏、關(guān)注、評論啦 !
謝謝哦!如果不懂,歡迎大家下方討論學(xué)習(xí)哦。
到了這里,關(guān)于【操作系統(tǒng)】同步和互斥詳細(xì)講解(算法+源碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!