在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2022-08-26 20:44 ? 次閱讀

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

1.讀寫鎖簡介

讀寫鎖,它把對共享資源的訪問者劃分成讀者和寫者,讀者只對共享資源進行讀訪問,寫者則需要對共享資源進行寫操作。

一次只有一個線程可以占有寫模式的讀寫鎖,但是可以有多個線程同時占有讀模式的讀寫鎖。正是因為這個特性,當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的線程都會被阻塞。

當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的線程都可以得到訪問權, 但是如果線程希望以寫模式對此鎖進行加鎖,它必須直到所有的線程釋放鎖。

通常,當讀寫鎖處于讀模式鎖住狀態時,如果有另外線程試圖以寫模式加鎖,讀寫鎖通常會阻塞隨后的讀模式鎖請求,這樣可以避免讀模式鎖長期占用,而等待的寫模式鎖請求長期阻塞。

讀寫鎖適合于對數據結構的讀次數比寫次數多得多的情況。因為,讀模式鎖定時可以共享, 以寫模式鎖住時意味著獨占, 所以讀寫鎖又叫共享-獨占鎖。

pYYBAGMIwECAM9HdAACMyXIU438691.png#pic_center

1.1 相關函數

#include 
//銷毀讀寫鎖
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
//讀寫鎖初始化
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr);
//讀加鎖
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
//寫加鎖
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
//解鎖
pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

1.2 示例

??創建兩個線程,2個子線程讀數據,主線程負責寫數據。

#include 
#include 
#include 
int data=0;
pthread_rwlock_t rwlock;
/*讀線程1*/
void *pth1_work(void *arg)
{
	int a;
	while(1)
	{
		pthread_rwlock_rdlock(&rwlock);//讀上鎖
		a=data;
		printf("----------------線程1讀數據-----------------------\n");
		sleep(5);
		printf("[%s]線程1,data=%d\n",__FUNCTION__,a);
		pthread_rwlock_unlock(&rwlock);//解鎖
		usleep(10);
	}
}
/*讀線程2*/
void *pth2_work(void *arg)
{
	int a;
	while(1)
	{
		pthread_rwlock_rdlock(&rwlock);//讀上鎖
		a=data;
		printf("----------------線程2讀數據-----------------------\n");
		sleep(5);
		printf("[%s]線程1,data=%d\n",__FUNCTION__,a);
		pthread_rwlock_unlock(&rwlock);//解鎖
		usleep(10);
	}
}
int main()
{
	
	pthread_rwlock_init(&rwlock,NULL);/*創建讀寫鎖*/
	/*創建線程1*/
	pthread_t id;
	pthread_create(&id,NULL,pth1_work,NULL);
	pthread_detach(id);//設置為分離屬性	
	
	/*創建線程2*/
	pthread_create(&id,NULL,pth2_work,NULL);
	pthread_detach(id);//設置為分離屬性
	/*寫線程*/
	while(1)
	{
		pthread_rwlock_wrlock(&rwlock);//寫加鎖
		printf("主線程寫數據............\n");
		sleep(3);
		data+=100;
		printf("主線程寫數據完\n");
		pthread_rwlock_unlock(&rwlock);//解鎖
		usleep(10);
	}
}
poYBAGMIwECAd_rXAAH4w3uS_fg183.png#pic_center

2.條件變量

2.1 條件變量簡介

條件變量是線程可用的一種同步機制,條件變量給多個線程提供了一個回合的場所,條件變量和互斥量一起使用,允許線程以無競爭的方式等待特定的條件發生。

條件變量是利用線程間共享的全局變量進行同步的一種機制,主要包括兩個動作:一個線程等待"條件變量的條件成立"而掛起;另一個線程使"條件成立"(給出條件成立信號)。為了防止競爭,條件變量的使用總是和一個互斥鎖結合在一起。

注意:條件變量需要和互斥鎖一起使用。

例如:線程4推送屏幕圖像數據給各個子線程,需要1s推送一次;線程1、2、3獲取推送的數據的頻率則遠小于1s時間,若此類情況使用讀寫鎖則會導致子線程頻繁獲取相同數據幀,極大浪費CPU資源。而使用條件變量則可以有效解決資源浪費問題。

pYYBAGMIwEGATGHHAAFCWYjyWwk022.png#pic_center

2.2 相關函數

#include 
//銷毀條件變量
int pthread_cond_destroy(pthread_cond_t *cond);
//動態初始化條件變量
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);
//靜態初始化條件變量
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
//等待條件變量產生
pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
//廣播喚醒所有線程
int pthread_cond_broadcast(pthread_cond_t *cond);
//隨機喚醒一個線程
int pthread_cond_signal(pthread_cond_t *cond);

2.3 示例

??創建5個子線程,子線程等待條件變量產生,主線程捕獲 SIGINT(CTRL+C信號)和SIGQUIT(CTRL+\)信號,通過信號實現廣播喚醒所有線程和隨機喚醒一個線程。

#include 
#include 
#include 
#include 
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//互斥鎖
pthread_cond_t cond;
void *pth_work(void *arg)
{
	int cnt=(int *)arg;	
	pthread_mutex_lock(&mutex);//互斥鎖上鎖
	printf("線程%d運行中.....\n",cnt);
	pthread_cond_wait(&cond,&mutex);//等待條變量產生,本身自帶解鎖功能

	printf("線程%d喚醒成功,id=%lu\n",cnt,pthread_self());
	pthread_mutex_unlock(&mutex);//互斥鎖解鎖
}
void sig_work(int sig)
{
	if(sig==SIGINT)
	{
		pthread_mutex_lock(&mutex);//互斥鎖上鎖
		pthread_cond_signal (&cond);//隨機喚醒一個線程
		pthread_mutex_unlock(&mutex);//互斥鎖解鎖
	}
	if(sig==SIGQUIT)
	{
		pthread_mutex_lock(&mutex);//互斥鎖上鎖
		pthread_cond_broadcast(&cond);//廣播喚醒所有線程
		pthread_mutex_unlock(&mutex);//互斥鎖解鎖
	}
}
int main()
{
	signal(SIGINT,sig_work);//捕獲CTRL+C
	signal(SIGQUIT,sig_work);//捕獲CTRL+\
	/*創建條件變量*/
	pthread_cond_init(&cond,NULL);
	pthread_t pth[5];
	int i=0;
	for(i=0;i<5;i++)
	{
		pthread_create(&pth[i],NULL,pth_work,(void*)i);
	}
	for(i=0;i<5;i++)
	{
		pthread_join(pth[i],NULL);
	}
	pthread_cond_destroy(&cond);
	pthread_mutex_destroy(&mutex);
	printf("所有線程結束\n");
	return 0;
}   
poYBAGMIwEGAGDFpAAGlFBJ7RUY395.png#pic_center

2.4 示例2

編寫程序完成如下功能:
?1)有一int型全局變量g_Flag初始值為0;
?2) 在主線稱中起動線程1,打印“this is thread1”,并將g_Flag設置為1
?3) 在主線稱中啟動線程2,打印“this is thread2”,并將g_Flag設置為2
?4) 主線程在檢測到g_Flag從1變為2,或者從2變為1的時候退出

#include 
#include 
#include 
#include 
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//互斥鎖
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int g_Flag=0;
void *pth_work(void *arg)
{
	printf("this is thread1\n");
	pthread_mutex_lock(&mutex);
	if(g_Flag==2)
	{
		g_Flag=1;
		pthread_cond_signal(&cond);//隨機喚醒一個線程
	}
	else 
	{
		g_Flag=1;
	}
	printf("線程1:%d\n",g_Flag);
	pthread_mutex_unlock(&mutex);
}

void *pth2_work(void *arg)
{
	printf("this is thread2\n");
	pthread_mutex_lock(&mutex);
	if(g_Flag==1)
	{
		g_Flag=2;;
		pthread_cond_signal(&cond);//隨機喚醒一個線程
	}
	else 
	{
		g_Flag=2;
	}
	printf("線程2:%d\n",g_Flag);
	pthread_mutex_unlock(&mutex);
}
int main()
{
	pthread_t pth;
	/*創建線程1*/
	pthread_create(&pth,NULL,pth_work,NULL);
	pthread_detach(pth);//設置為分離屬性
	/*創建線程2*/
	pthread_create(&pth,NULL,pth2_work,NULL);
	pthread_detach(pth);//設置為分離屬性
	
	pthread_mutex_lock(&mutex);
	pthread_cond_wait(&cond,&mutex);
	pthread_mutex_unlock(&mutex);

	pthread_cond_destroy(&cond);
	pthread_mutex_destroy(&mutex);
	printf("所有線程結束\n");
	return 0;
}  

運行效果:

pYYBAGMIwEGAd5IbAADSZXzCm5M271.png#pic_center

審核編輯 黃昊宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209483
  • 線程
    +關注

    關注

    0

    文章

    504

    瀏覽量

    19682
收藏 人收藏

    評論

    相關推薦

    Linux下線程編程

    Linux下線程編程
    的頭像 發表于 08-24 15:42 ?1911次閱讀

    Linux系統中線程同步方式中的條件變量方法

    今天主要和大家聊一聊,如何使用Linux線程同步方式中的條件變量
    發表于 11-08 09:16 ?532次閱讀

    線程編程之三 線程通訊

    線程編程之三 線程通訊七、線程通訊  一般而言
    發表于 10-22 11:43

    Linux線程線程同步

    pthread_mutex_lock先加鎖,操作完之后pthread_mutex_unlock再解鎖。5、線程同步條件變量:使用條件
    發表于 12-08 14:14

    Linux C 多線程編程之互斥條件變量實例詳解

    Test()二、條件變量這里主要說說 pthread_cond_wait()的用法,在下面有說明。條件變量是利用線程
    發表于 06-03 17:13

    淺析linux下的條件變量

    ? 一.條件變量 ? ? 條件變量是用來等待線程而不是上鎖的,條件
    發表于 07-12 08:10

    Linux線程同步方法

    Linux下提供了多種方式來處理線程同步,最常用的是互斥條件變量和信號量。
    發表于 07-19 07:24

    很多變量線程讀寫是使用關中斷好還是使用互斥進行保護呢?

    我想問一下,就是我有很多變量會多線程讀寫操作,有一些會比較頻繁,我讀寫的時候是使用中斷去保護還是增加互斥量去保護。 1.如果加互斥量,當前低優先級
    發表于 05-05 14:14

    了解Linux線程線程同步

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

    詳談Linux操作系統的三種狀態的讀寫

    讀寫是另一種實現線程同步的方式。與互斥量類似,但讀寫將操作分為讀、寫兩種方式,可以多個
    的頭像 發表于 09-27 14:57 ?3116次閱讀

    詳談Linux操作系統編程的條件變量

    條件變量是用來等待線程而不是上鎖的,條件變量通常和互斥一起使用。
    的頭像 發表于 09-27 15:23 ?2001次閱讀
    詳談<b class='flag-5'>Linux</b>操作系統編程的<b class='flag-5'>條件</b><b class='flag-5'>變量</b>

    Linux下線程通訊--互斥

    互斥是一種簡單的加鎖的方法來控制對共享資源的存取,當多個線程訪問公共資源時,為了保證同一時刻只有一個線程獨占資源,就可以通過互斥加以限制,在一個時刻只能有一個
    的頭像 發表于 08-24 15:53 ?1965次閱讀
    <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線程條件變量是什么意思

    條件變量 條件變量用于自動阻塞線程,直到某個特定事件發生或某個條件滿足為止,通常情況下,
    的頭像 發表于 07-21 11:18 ?518次閱讀

    讀寫的實現原理規則

    讀寫 互斥或自旋要么是加鎖狀態、要么是不加鎖狀態,而且一次只有一個線程可以對其加鎖。 讀寫
    的頭像 發表于 07-21 11:21 ?910次閱讀
    <b class='flag-5'>讀寫</b><b class='flag-5'>鎖</b>的實現原理規則

    互斥條件變量的使用

    本文主要分為三個部分: 第一部分簡要介紹線程的概念及其使用 第二部分主要介紹互斥條件變量的使用(重點探討pthread_cond_wait) 第三部分參考運行IBM的多
    的頭像 發表于 11-10 14:51 ?619次閱讀
    互斥<b class='flag-5'>鎖</b>及<b class='flag-5'>條件</b><b class='flag-5'>變量</b>的使用
    主站蜘蛛池模板: 天天干夜夜笙歌| 久久不射影院| 色视频在线免费观看| 天堂在线www| 色月| 欧美在线91| 久久视频免费| 国产高清视频免费最新在线 | 中文字幕区| 91人成网站色www免费| 亚洲免费在线观看视频| 成年人污视频| 亚洲影视大全| 四虎影院永久免费| 欧美一级片在线视频| 激情91| 夜夜爱视频| 久久综合视频网| 视频网站黄| 美女被异性狂揉下部羞羞视频 | 黄色福利网| www资源| 色综合亚洲| 西西人体大胆高清啪啪欧洲| 猛操女人| 二级黄色大片| 天天性综合| 91精品久久久久含羞草| 亚洲国产福利精品一区二区| 伊人网成人| 女色专区| 在线播放国产不卡免费视频| 日操夜干| 中文字幕国产一区| 亚洲国产情侣偷自在线二页| 欧美三级 欧美一级| 丁香六月婷婷七月激情| 欧美精品xxxxbbbb| 男人cao女人视频在线观看| 中国三级视频| 欧美性天堂|