日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

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

新聞中心

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

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

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

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

下面通過一個簡單的例子來說明如何利用句柄實現(xiàn)線程間的共享。假設(shè)有兩個線程,分別代表兩個進程,要共享一個共享內(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)建了兩個線程,一個線程用來寫入共享內(nèi)存區(qū)域,另一個線程用來讀取共享內(nèi)存區(qū)域,并將讀取到的內(nèi)容打印出來??梢钥吹?,兩個線程都通過shmat函數(shù)獲取共享內(nèi)存區(qū)域的地址,從而可以對該共享內(nèi)存進行讀寫操作。在這個例子中,shmat函數(shù)返回的就是共享內(nèi)存區(qū)域的句柄,兩個線程都擁有該句柄,并利用它來共享內(nèi)存。

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

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

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

From :

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

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

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

3.對

多線程

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

互斥鎖

條件變量

讀寫鎖

信號量

一種特殊的

全局變量

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

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

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

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

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

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

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

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

互斥鎖存在缺點:

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

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

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

程序的效率無疑會大大提高。

1)創(chuàng)建

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

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

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

2)注銷

int pthread_cond_destory(&cond)

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

因為Linux實現(xiàn)的條件變量沒有分配什么資源,所以注銷動作只包括檢查是否姿肢改有等待線程!(請參考條件變量的底層實現(xiàn))

3)等待

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

計時等待:int pthread_cond_timewait(&cond,&mutex,time)

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

2.無論那種等待方式,都必須有一個互斥鎖配合,以防止多個線程同時請求pthread_cond_wait形成競爭條件!

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

4)激發(fā)

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

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

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

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

pthread_cond_broadcast & pthread_cond_signal

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

2.讀寫鎖最適用于對

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

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

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

4.讀寫鎖有兩種策略:強讀同步和強寫同步

強讀同步:

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

強寫同步:

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

1)初始化的銷毀讀寫鎖

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

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

銷毀讀寫鎖:int pthread_rwlock_destory(rwlock)

在釋放某個讀寫鎖的資源之前,需要先通過pthread_rwlock_destory函數(shù)對讀寫鎖進行清理。釋放由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),釋放鎖

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

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

int pthread_rwlock_tryrdlock(rwlock)

int pthread_rwlock_trywrlock(rwlock)

互斥鎖只允許一個線程進入臨界區(qū),而信號量允許多個線程進入臨界區(qū)。

1)信號量初始化

int sem_init(&sem,pshared, v)

pshared為0,表示這個信號量是當(dāng)前進程的局部信號量。

pshared為1,表示這個信號量可以在多個進程之間共享。

v為信號量的初始值。

返回值

成功:0,失?。?1

2)信號量值的加減

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

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

3)對信號量進行清理

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。


當(dāng)前題目:Linux線程共享技巧:探討句柄的應(yīng)用(linux線程共享句柄)
分享地址:http://www.dlmjj.cn/article/cohoejo.html