欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux下線程間通訊--互斥鎖

嵌入式技術(shù) ? 來(lái)源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-08-24 15:53 ? 次閱讀

Linux下線程間通訊--互斥鎖

1.互斥鎖簡(jiǎn)介

編程中,引入了對(duì)象互斥鎖的概念,來(lái)保證共享數(shù)據(jù)操作的完整性。每個(gè)對(duì)象都對(duì)應(yīng)于一個(gè)可稱為" 互斥鎖" 的標(biāo)記,這個(gè)標(biāo)記用來(lái)保證在任一時(shí)刻,只能有一個(gè)線程訪問(wèn)該對(duì)象。

互斥鎖(Mutex)是在原子操作API的基礎(chǔ)上實(shí)現(xiàn)的信號(hào)量行為?;コ怄i不能進(jìn)行遞歸鎖定或解鎖,能用于交互上下文但是不能用于中斷上下文,同一時(shí)間只能有一個(gè)任務(wù)持有互斥鎖,而且只有這個(gè)任務(wù)可以對(duì)互斥鎖進(jìn)行解鎖。

互斥鎖是一種簡(jiǎn)單的加鎖的方法來(lái)控制對(duì)共享資源的存取,當(dāng)多個(gè)線程訪問(wèn)公共資源時(shí),為了保證同一時(shí)刻只有一個(gè)線程獨(dú)占資源,就可以通過(guò)互斥鎖加以限制,在一個(gè)時(shí)刻只能有一個(gè)線程掌握某個(gè)互斥鎖,擁有上鎖狀態(tài)的線程才能夠?qū)蚕碣Y源進(jìn)行操作。若其他線程希望上鎖一個(gè)已經(jīng)上鎖了的互斥鎖,則該線程就會(huì)掛起,直到上鎖的線程釋放掉互斥鎖為止。

2.互斥鎖相關(guān)函數(shù)

在Posix Thread中定義有一套專門用于線程同步的mutex函數(shù)。可以通過(guò)靜態(tài)和動(dòng)態(tài)兩種方式創(chuàng)建互斥鎖。
互斥鎖有三個(gè)類型可供選擇:

PTHREAD_MUTEX_TIMED_NP普通鎖(默認(rèn)鎖):

當(dāng)一個(gè)線程加鎖以后,其余請(qǐng)求鎖的線程將形成一個(gè)阻塞等待隊(duì)列,并在解鎖后按優(yōu)先級(jí)獲得鎖。這種鎖策略保證了資源分配的公平性。

PTHREAD_MUTEX_RECURSIVE_NP嵌套鎖:

允許同一個(gè)線程對(duì)同一個(gè)鎖成功獲得多次,并通過(guò)多次unlock 解鎖。如果是不同線程請(qǐng)求,則在加鎖線程解鎖時(shí)重新競(jìng)爭(zhēng)。
嵌套鎖對(duì)同一線程可以重復(fù)上鎖成功,對(duì)不同線程不能重復(fù)上鎖。
嵌套鎖在同一線程中重復(fù)上鎖,需要重復(fù)解鎖,否則其它線程將阻塞。

PTHREAD_MUTEX_ERRORCHECK_NP檢錯(cuò)鎖:

如果同一個(gè)線程請(qǐng)求同一個(gè)鎖,則返回 EDEADLK,否則與普通鎖類型動(dòng)作相同。 這樣就保證當(dāng)不允許多次加鎖時(shí)不會(huì)出現(xiàn)最簡(jiǎn)單情況下的死鎖。

檢錯(cuò)鎖的主要特點(diǎn)就是: 同一個(gè)線程無(wú)法多次重復(fù)進(jìn)行加鎖, 第一次獲取鎖成功后, 沒(méi)有解鎖的情況下, 如果繼續(xù)獲取鎖將不會(huì)阻塞, 會(huì)返回一個(gè)錯(cuò)誤值(35)。

動(dòng)態(tài)方式初始化互斥鎖:
int pthread_mutex_init(pthread_mutex_t *restrict mutex,constpthread_mutexattr_t *restrict attr);
??attr填NULL表示使用默認(rèn)屬性,創(chuàng)建普通鎖。
//靜態(tài)方式初始化互斥鎖
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
//互斥鎖上鎖,多次請(qǐng)求則會(huì)阻塞
int pthread_mutex_lock(pthread_mutex_t *mutex);
//互斥鎖上鎖,多次請(qǐng)求不會(huì)阻塞,會(huì)返回上鎖失敗錯(cuò)誤信息
int pthread_mutex_trylock(pthread_mutex_t *mutex);
//互斥解鎖
int pthread_mutex_unlock(pthread_mutex_t *mutex);
//銷毀互斥鎖
int pthread_mutex_destroy(pthread_mutex_t *mutex);

3.互斥鎖編程

3.1練習(xí)1

??1.創(chuàng)建1個(gè)線程,子線程先打印10遍hello,world,然后主線程再打印5遍”12346”,按次順序循環(huán)50次。

#include 
#include 
#include 
/*
1.創(chuàng)建1個(gè)線程,子線程先打印10遍hello,world,然后主線程再打印5遍”12346”,按次順序循環(huán)50次。
*/
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//靜態(tài)初始化互斥鎖1
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;//靜態(tài)初始化互斥鎖2
void *pth_work(void *arg)
{
	int i,j;
	for(i=0;i<50;i++)
	{
		pthread_mutex_lock(&mutex);
		printf("-----------子線程第%d遍-----------\n",i);
		for(j=0;j<10;j++)
		{
			printf("hello,world\n");
		}
		pthread_mutex_unlock(&mutex2);
	}
}
int main()
{
	int i=0,j;
	pthread_t pthid;
	pthread_mutex_lock(&mutex2);
	/*創(chuàng)建子線程*/
	pthread_create(&pthid,NULL,pth_work,NULL);//創(chuàng)建線程
	pthread_detach(pthid);
	for(i=0;i<50;i++)
	{
		pthread_mutex_lock(&mutex2);//互斥鎖上鎖
		printf("-----------主線程第%d遍-----------\n",i);
		for(j=0;j<5;j++)//主線程打印
		{
			printf("123456\n");
		}
		pthread_mutex_unlock(&mutex);
	}
	pthread_mutex_destroy(&mutex);
	pthread_mutex_destroy(&mutex2);

}
pYYBAGMF2PKAWZXzAAHlP4bPJ8M761.png#pic_center

3.2練習(xí)2

??2.創(chuàng)建3線程,線程1打印A,線程2打印B,線程3打印C,按照ABC順序輸出10遍。

#include 
#include 
#include 
/*
2.創(chuàng)建3線程,線程1打印A,線程2打印B,線程3打印C,按照ABC順序輸出10遍。
*/
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//靜態(tài)初始化互斥鎖1
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;//靜態(tài)初始化互斥鎖2
pthread_mutex_t mutex3 = PTHREAD_MUTEX_INITIALIZER;//靜態(tài)初始化互斥鎖3
void *pth_work(void *arg)
{
	int cnt=(int *)arg;
	//printf("cnt=%d\n",cnt);
	for(int i=0;i<10;i++)
	{
		if(cnt==0)//線程1
		{
			pthread_mutex_lock(&mutex);
			printf("A");
			pthread_mutex_unlock(&mutex2);
		}
		if(cnt==1)//線程2
		{
			pthread_mutex_lock(&mutex2);
			printf("B");
			pthread_mutex_unlock(&mutex3);
		}
		if(cnt==2)//線程3
		{
			pthread_mutex_lock(&mutex3);
			printf("C");
			fflush(stdout);//刷新緩沖區(qū)
			pthread_mutex_unlock(&mutex);
		}
	}
}
int main()
{
	int i=0;
	pthread_t pthid[3];
	pthread_mutex_lock(&mutex2);
	pthread_mutex_lock(&mutex3);
	/*創(chuàng)建3個(gè)子線程*/
	for(i=0;i<3;i++)
	{
		pthread_create(&pthid[i],NULL,pth_work,(void *)i);
	}
	/*等待線程結(jié)束*/
	for(i=0;i<3;i++)
	{
		pthread_join(pthid[i],NULL);
	}
	printf("\n所有子線程結(jié)束,程序退出!\n");
	pthread_mutex_destroy(&mutex);
	pthread_mutex_destroy(&mutex2);
	pthread_mutex_destroy(&mutex3);
}

運(yùn)行效果:

[wbyq@wbyq ubuntu]$ ./app 
ABCABCABCABCABCABCABCABCABCABC
所有子線程結(jié)束,程序退出!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11351

    瀏覽量

    210497
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    505

    瀏覽量

    19763
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux下線程編程

    Linux下線程編程
    的頭像 發(fā)表于 08-24 15:42 ?1944次閱讀

    Linux下線程通訊---讀寫和條件變量

    讀寫,它把對(duì)共享資源的訪問(wèn)者劃分成讀者和寫者,讀者只對(duì)共享資源進(jìn)行讀訪問(wèn),寫者則需要對(duì)共享資源進(jìn)行寫操作。件變量是線程可用的一種同步機(jī)制,條件變量給多個(gè)線程提供了一個(gè)回合的場(chǎng)所,條件變量和
    的頭像 發(fā)表于 08-26 20:44 ?1562次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下線程</b><b class='flag-5'>間</b><b class='flag-5'>通訊</b>---讀寫<b class='flag-5'>鎖</b>和條件變量

    Linux高級(jí)編程---互斥

    Linux系統(tǒng)里,有很多的應(yīng)用,包括互斥,文件,讀寫等等,信號(hào)量其實(shí)也應(yīng)該是
    發(fā)表于 01-13 10:07

    Linux線程線程同步

    ,可以指定返回值,以便其他線程通過(guò)pthread_join函數(shù)獲取該線程的返回值。void *status:指針線程終止的返回值。4、線程
    發(fā)表于 12-08 14:14

    Linux C多線程編程之互斥與條件變量實(shí)例詳解

    死鎖主要發(fā)生在有多個(gè)依賴存在時(shí), 會(huì)在一個(gè)線程試圖以與另一個(gè)線程相反順序鎖住互斥量時(shí)發(fā)生. 如何避免死鎖是使用互斥量應(yīng)該格外注意的東西。
    的頭像 發(fā)表于 03-29 11:53 ?6659次閱讀

    了解Linux線程線程同步

    進(jìn)程通信IPC,線程可以直接讀寫進(jìn)程數(shù)據(jù)段(如全局變量)來(lái)進(jìn)行通信——需要進(jìn)程同步和互斥手段的輔助,以保證數(shù)據(jù)的一致性。
    發(fā)表于 04-23 14:23 ?746次閱讀
    了解<b class='flag-5'>Linux</b>多<b class='flag-5'>線程</b>及<b class='flag-5'>線程</b><b class='flag-5'>間</b>同步

    Linux線程互斥互斥

    情況是指可以允許多個(gè)訪問(wèn)者同時(shí)訪問(wèn)資源互斥量Mutex:本質(zhì)上說(shuō)就是一把,提供對(duì)資源的獨(dú)占訪問(wèn),所以Mutex主要的作用是用于互斥。互斥量使同時(shí)只能有一個(gè)
    發(fā)表于 04-02 14:47 ?282次閱讀

    詳談Linux操作系統(tǒng)編程的互斥量mutex

    前文提到,系統(tǒng)中如果存在資源共享,線程存在競(jìng)爭(zhēng),并且沒(méi)有合理的同步機(jī)制的話,會(huì)出現(xiàn)數(shù)據(jù)混亂的現(xiàn)象。為了實(shí)現(xiàn)同步機(jī)制,Linux中提供了多種方式,其中一種方式為互斥
    的頭像 發(fā)表于 09-28 15:09 ?2554次閱讀
    詳談<b class='flag-5'>Linux</b>操作系統(tǒng)編程的<b class='flag-5'>互斥</b>量mutex

    兩個(gè)線程互斥如何形成死循環(huán)?

    兩個(gè)線程,兩個(gè)互斥如何形成死鎖?程序流程圖如下: 程序流程圖 如上圖所示: t0時(shí)刻,主線程創(chuàng)建子線程,并初始化
    的頭像 發(fā)表于 01-02 16:47 ?1522次閱讀
    兩個(gè)<b class='flag-5'>線程</b>和<b class='flag-5'>互斥</b><b class='flag-5'>鎖</b>如何形成死循環(huán)?

    兩個(gè)線程,兩個(gè)互斥如何形成死鎖

    兩個(gè)線程,兩個(gè)互斥如何形成死鎖? 程序流程圖如下: 程序流程圖 如上圖所示: t0時(shí)刻,主線程創(chuàng)建子線程,并初始化
    的頭像 發(fā)表于 12-28 09:24 ?2287次閱讀
    兩個(gè)<b class='flag-5'>線程</b>,兩個(gè)<b class='flag-5'>互斥</b><b class='flag-5'>鎖</b>如何形成死鎖

    Linux實(shí)例:多線程互斥到底該如何使用

    最近在寫多進(jìn)程和Linux中的各種的文章,總覺(jué)得只有文字講解雖然能夠知道多進(jìn)程和互斥是什么,但是還是不知道到底該怎么用。
    發(fā)表于 05-18 14:16 ?448次閱讀
    <b class='flag-5'>Linux</b>實(shí)例:多<b class='flag-5'>線程</b>和<b class='flag-5'>互斥</b><b class='flag-5'>鎖</b>到底該如何使用

    Linux互斥的作用 互斥是什么

    1、互斥 互斥(mutex),在訪問(wèn)共享資源之前對(duì)互斥進(jìn)行上鎖,在訪問(wèn)完成后釋放
    的頭像 發(fā)表于 07-21 11:13 ?1008次閱讀

    Linux線程條件變量是什么意思

    條件變量 條件變量用于自動(dòng)阻塞線程,直到某個(gè)特定事件發(fā)生或某個(gè)條件滿足為止,通常情況下,條件變量是和互斥一起搭配使用的。使用條件變量主要包括兩個(gè)動(dòng)作: 一個(gè)線程等待某個(gè)條件滿足而被阻
    的頭像 發(fā)表于 07-21 11:18 ?566次閱讀

    互斥和自旋的區(qū)別 自旋臨界區(qū)可以被中斷嗎?

    互斥和自旋的區(qū)別 自旋臨界區(qū)可以被中斷嗎? 互斥和自旋
    的頭像 發(fā)表于 11-22 17:41 ?899次閱讀

    互斥和自旋的實(shí)現(xiàn)原理

    互斥和自旋是操作系統(tǒng)中常用的同步機(jī)制,用于控制對(duì)共享資源的訪問(wèn),以避免多個(gè)線程或進(jìn)程同時(shí)訪問(wèn)同一資源,從而引發(fā)數(shù)據(jù)不一致或競(jìng)爭(zhēng)條件等問(wèn)題。 互斥
    的頭像 發(fā)表于 07-10 10:07 ?628次閱讀