日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Linux線程共享技巧:探討句柄的應(yīng)用(linux線程共享句柄)

操作系統(tǒng)的本質(zhì)是為了管理硬件資源,提供給應(yīng)用程序統(tǒng)一的接口,使得應(yīng)用程序可以直接使用硬件資源,而不需要過(guò)多關(guān)注底層硬件的細(xì)節(jié)。線程是應(yīng)用程序中非常重要的概念,它可以讓應(yīng)用程序變得高效和可靠。在Linux系統(tǒng)中,線程也是重要的概念之一,它對(duì)應(yīng)的就是輕量級(jí)進(jìn)程(LWP)。Linux系統(tǒng)中線程的創(chuàng)建和銷毀都比較容易,但是如何實(shí)現(xiàn)線程間的共享,則需要使用到一些技巧,其中之一就是句柄的應(yīng)用。

創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)由有經(jīng)驗(yàn)的網(wǎng)站設(shè)計(jì)師、開發(fā)人員和項(xiàng)目經(jīng)理組成的專業(yè)建站團(tuán)隊(duì),負(fù)責(zé)網(wǎng)站視覺(jué)設(shè)計(jì)、用戶體驗(yàn)優(yōu)化、交互設(shè)計(jì)和前端開發(fā)等方面的工作,以確保網(wǎng)站外觀精美、網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作易于使用并且具有良好的響應(yīng)性。

句柄是一種抽象的概念,通常表示一些資源的標(biāo)識(shí)符。在Linux系統(tǒng)中,許多資源都可以通過(guò)句柄來(lái)進(jìn)行描述和處理,比如文件、套接字、管道等等。在多線程環(huán)境中,句柄被廣泛應(yīng)用在線程間的共享中,可以讓不同的線程共享同一個(gè)句柄,從而實(shí)現(xiàn)資源的共享。

下面通過(guò)一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明如何利用句柄實(shí)現(xiàn)線程間的共享。假設(shè)有兩個(gè)線程,分別代表兩個(gè)進(jìn)程,要共享一個(gè)共享內(nèi)存區(qū)域,代碼如下:

“`

#include

#include

#include

#include

#include

#include

#include

#include

#define SHM_SIZE 1024

void *thread1(void *arg);

void *thread2(void *arg);

int shmid;

int mn(int argc, char **argv)

{

pthread_t tid1, tid2;

shmid = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666);

if (shmid == -1) {

perror(“shmget”);

exit(EXIT_FLURE);

}

if (pthread_create(&tid1, NULL, thread1, NULL) != 0) {

perror(“pthread_create”);

exit(EXIT_FLURE);

}

if (pthread_create(&tid2, NULL, thread2, NULL) != 0) {

perror(“pthread_create”);

exit(EXIT_FLURE);

}

if (pthread_join(tid1, NULL) != 0) {

perror(“pthread_join”);

exit(EXIT_FLURE);

}

if (pthread_join(tid2, NULL) != 0) {

perror(“pthread_join”);

exit(EXIT_FLURE);

}

if (shmctl(shmid, IPC_RMID, NULL) == -1) {

perror(“shmctl”);

exit(EXIT_FLURE);

}

exit(EXIT_SUCCESS);

}

void *thread1(void *arg)

{

void *shmaddr;

shmaddr = shmat(shmid, NULL, 0);

if (shmaddr == (void *)-1) {

perror(“shmat”);

exit(EXIT_FLURE);

}

printf(“Thread1 attach shared-memory\n”);

strcpy(shmaddr, “Hello, world!\n”);

pthread_exit(NULL);

}

void *thread2(void *arg)

{

void *shmaddr;

usleep(500000);

shmaddr = shmat(shmid, NULL, 0);

if (shmaddr == (void *)-1) {

perror(“shmat”);

exit(EXIT_FLURE);

}

printf(“Thread2 attach shared-memory\n”);

printf(“Message: %s\n”, (char *)shmaddr);

pthread_exit(NULL);

}

“`

上面的代碼創(chuàng)建了兩個(gè)線程,一個(gè)線程用來(lái)寫入共享內(nèi)存區(qū)域,另一個(gè)線程用來(lái)讀取共享內(nèi)存區(qū)域,并將讀取到的內(nèi)容打印出來(lái)。可以看到,兩個(gè)線程都通過(guò)shmat函數(shù)獲取共享內(nèi)存區(qū)域的地址,從而可以對(duì)該共享內(nèi)存進(jìn)行讀寫操作。在這個(gè)例子中,shmat函數(shù)返回的就是共享內(nèi)存區(qū)域的句柄,兩個(gè)線程都擁有該句柄,并利用它來(lái)共享內(nèi)存。

這個(gè)例子雖然簡(jiǎn)單,但也說(shuō)明了句柄在Linux線程間共享中的重要性。句柄的應(yīng)用使得不同的線程可以共享同一資源,從而提高了線程的利用率和系統(tǒng)的可靠性。當(dāng)然,在使用句柄時(shí),需要注意同步和錯(cuò)誤處理的問(wèn)題,否則可能會(huì)出現(xiàn)一些難以預(yù)料的問(wèn)題。

成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!

Linux C++多線程同步的四種方式

From :

1.同一個(gè)線程內(nèi)部,指令按照先后順序執(zhí)行;但不同線程之間的指令很難說(shuō)清楚是哪一個(gè)先執(zhí)行,在并況下,指令執(zhí)行的先后順序由內(nèi)核決定。

如果運(yùn)行的結(jié)果依賴于不同線程執(zhí)行的先后的話,那么就會(huì)形成競(jìng)爭(zhēng)條件,在這樣的情況下,計(jì)算的結(jié)果很難預(yù)知,所以應(yīng)該盡量避免競(jìng)爭(zhēng)條件的形成。

2.最常見的解決競(jìng)爭(zhēng)條件的方法是:將原先分離的兩個(gè)指令構(gòu)成一個(gè)不可分割的原子操作,而其他任務(wù)不能插入到原子操作中!

3.對(duì)

多線程

來(lái)說(shuō),同步指的是在一定時(shí)間內(nèi)只允許某一個(gè)線程訪問(wèn)某個(gè)資源,而在此時(shí)間內(nèi),不允許其他線程訪問(wèn)該資源!

互斥鎖

條件變量

讀寫鎖

信號(hào)量

一種特殊的

全局變量

,擁有l(wèi)ock和unlock兩種狀態(tài)。

unlock的互斥鎖可以由某個(gè)線程獲得,一旦獲得,這個(gè)互斥鎖會(huì)鎖上變成lock狀態(tài),此后只有該線程由權(quán)力打開該鎖,其他線程想要獲得互斥鎖,必須得到互斥鎖再次被打開之后。

1.互斥鎖的初始化, 分為靜態(tài)初始化和動(dòng)態(tài)初始化.

2.互斥鎖的相關(guān)屬性及分類

(1) attr表示互斥鎖的屬性;

(2) pshared表示互斥鎖的共享屬性,由兩種取值:

1)PTHREAD_PROCESS_PRIVATE:鎖只能用于一個(gè)進(jìn)程內(nèi)部的兩個(gè)線程進(jìn)行互斥(默認(rèn)情況)

2)PTHREAD_PROCESS_SHARED:鎖可用于兩個(gè)不同進(jìn)程中的線程進(jìn)行互斥,使用時(shí)還需要在進(jìn)程共享內(nèi)存中分配互斥鎖,然后為該互斥鎖指定屬性就可以了。

互斥鎖存在缺點(diǎn):

(1)某個(gè)線程正在等待共享數(shù)據(jù)內(nèi)某個(gè)條件出現(xiàn)。

(2)重復(fù)對(duì)數(shù)據(jù)對(duì)象加鎖和解鎖(輪詢),但是這樣輪詢非常耗費(fèi)時(shí)間和資源,而且效率非常低,所以互斥鎖不太適合這種情況。

當(dāng)線程在等待滿足某些條件時(shí),使線程進(jìn)入睡眠狀態(tài);一旦條件滿足,就換線因等待滿足特定條件而睡眠的線程。

程序的效率無(wú)疑會(huì)大大提高。

1)創(chuàng)建

靜態(tài)方式:pthread_cond_t cond PTHREAD_COND_INITIALIZER

動(dòng)態(tài)方式:int pthread_cond_init(&cond,NULL)

Linux thread 實(shí)現(xiàn)的條件變量不支持屬性,所以NULL(cond_attr參數(shù))

2)注銷

int pthread_cond_destory(&cond)

只有沒(méi)有線程在該條件變量上,該條件變量才能注饑畝銷,否則返回EBUSY

因?yàn)長(zhǎng)inux實(shí)現(xiàn)的條件變量沒(méi)有分配什么資源,所以注銷動(dòng)作只包括檢查是否姿肢改有等待線程!(請(qǐng)參考條件變量的底層實(shí)現(xiàn))

3)等待

條件等待:int pthread_cond_wait(&cond,&mutex)

計(jì)時(shí)等待:int pthread_cond_timewait(&cond,&mutex,time)

1.其中計(jì)時(shí)等待如果在給定時(shí)刻前條件沒(méi)有被滿足,則返回ETIMEOUT,結(jié)束等待

2.無(wú)論那種等待方式,都必須有一個(gè)互斥鎖配合,以防止多個(gè)線程同時(shí)請(qǐng)求pthread_cond_wait形成競(jìng)爭(zhēng)條件!

3.在調(diào)用pthread_cond_wait前必須由本線程加鎖

4)激發(fā)

激發(fā)一個(gè)等待線程:pthread_cond_signal(&cond)

激發(fā)所有等待線程:pthread_cond_broadcast(&cond)

重要的是,pthread_cond_signal不會(huì)存在驚群效應(yīng),也就是是它最多給一個(gè)等待線程發(fā)信號(hào),不會(huì)給所有線程發(fā)信號(hào)喚醒,然后要求他們自己去爭(zhēng)搶資源!

pthread_cond_broadcast() 喚醒所有正在pthread_cond_wait()的同一個(gè)條件變量的線程。注意:如果等待的多個(gè)現(xiàn)場(chǎng)不使用同一個(gè)鎖,被喚跡判醒的多個(gè)線程執(zhí)行是并發(fā)的。

pthread_cond_broadcast & pthread_cond_signal

1.讀寫鎖比互斥鎖更加具有適用性和并行性

2.讀寫鎖最適用于對(duì)

數(shù)據(jù)結(jié)構(gòu)

的讀操作讀操作次數(shù)多余寫操作次數(shù)的場(chǎng)合!

3.鎖處于讀模式時(shí)可以線程共享,而鎖處于寫模式時(shí)只能獨(dú)占,所以讀寫鎖又叫做共享-獨(dú)占鎖。

4.讀寫鎖有兩種策略:強(qiáng)讀同步和強(qiáng)寫同步

強(qiáng)讀同步:

總是給讀者更高的優(yōu)先權(quán),只要寫者沒(méi)有進(jìn)行寫操作,讀者就可以獲得訪問(wèn)權(quán)限

強(qiáng)寫同步:

總是給寫者更高的優(yōu)先權(quán),讀者只能等到所有正在等待或者執(zhí)行的寫者完成后才能進(jìn)行讀

1)初始化的銷毀讀寫鎖

靜態(tài)初始化:pthread_rwlock_t rwlock=PTHREAD_RWLOCK_INITIALIZER

動(dòng)態(tài)初始化:int pthread_rwlock_init(rwlock,NULL),NULL代表讀寫鎖采用默認(rèn)屬性

銷毀讀寫鎖:int pthread_rwlock_destory(rwlock)

在釋放某個(gè)讀寫鎖的資源之前,需要先通過(guò)pthread_rwlock_destory函數(shù)對(duì)讀寫鎖進(jìn)行清理。釋放由pthread_rwlock_init函數(shù)分配的資源

如果你想要讀寫鎖使用非默認(rèn)屬性,則attr不能為NULL,得給attr賦值

int pthread_rwlockattr_init(attr),給attr初始化

int pthread_rwlockattr_destory(attr),銷毀attr

2)以寫的方式獲取鎖,以讀的方式獲取鎖,釋放讀寫鎖

int pthread_rwlock_rdlock(rwlock),以讀的方式獲取鎖

int pthread_rwlock_wrlock(rwlock),以寫的方式獲取鎖

int pthread_rwlock_unlock(rwlock),釋放鎖

上面兩個(gè)獲取鎖的方式都是阻塞的函數(shù),也就是說(shuō)獲取不到鎖的話,調(diào)用線程不是立即返回,而是阻塞執(zhí)行,在需要進(jìn)行寫操作的時(shí)候,這種阻塞式獲取鎖的方式是非常不好的,你想一下,我需要進(jìn)行寫操作,不但沒(méi)有獲取到鎖,我還一直在這里等待,大大拖累效率

所以我們應(yīng)該采用非阻塞的方式獲取鎖:

int pthread_rwlock_tryrdlock(rwlock)

int pthread_rwlock_trywrlock(rwlock)

互斥鎖只允許一個(gè)線程進(jìn)入臨界區(qū),而信號(hào)量允許多個(gè)線程進(jìn)入臨界區(qū)。

1)信號(hào)量初始化

int sem_init(&sem,pshared, v)

pshared為0,表示這個(gè)信號(hào)量是當(dāng)前進(jìn)程的局部信號(hào)量。

pshared為1,表示這個(gè)信號(hào)量可以在多個(gè)進(jìn)程之間共享。

v為信號(hào)量的初始值。

返回值

成功:0,失?。?1

2)信號(hào)量值的加減

int sem_wait(&sem):以原子操作的方式將信號(hào)量的值減去1

int sem_post(&sem):以原子操作的方式將信號(hào)量的值加上1

3)對(duì)信號(hào)量進(jìn)行清理

int sem_destory(&sem)

關(guān)于linux 線程 共享 句柄的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。

創(chuàng)新互聯(lián)(cdcxhl.com)提供穩(wěn)定的云服務(wù)器,香港云服務(wù)器,BGP云服務(wù)器,雙線云服務(wù)器,高防云服務(wù)器,成都云服務(wù)器,服務(wù)器托管。精選鉅惠,歡迎咨詢:028-86922220。


標(biāo)題名稱:Linux線程共享技巧:探討句柄的應(yīng)用(linux線程共享句柄)
本文地址:http://www.5511xx.com/article/cohoejo.html