摘要:互斥鎖使得共享資源按序在各個(gè)線程中操作??煞譃榭焖冁i遞歸互斥鎖檢錯(cuò)互斥鎖信號(hào)量信號(hào)量也是操作系統(tǒng)中所用到的原語(yǔ)它廣泛用于進(jìn)程或線程間的同步與互斥本質(zhì)上是非負(fù)的整數(shù)計(jì)數(shù)器當(dāng)信號(hào)量的值大于或等于時(shí)該線程具有公共資源的訪問(wèn)權(quán)限。
日期 | 變更記錄 |
---|---|
2021-9-29 | 創(chuàng)建 |
線程是在共享內(nèi)存空間種并發(fā)的多道執(zhí)行路徑,它們共享一個(gè)進(jìn)程的資源。進(jìn)程是系統(tǒng)中程序執(zhí)行和資源分配的基本單位。線程是進(jìn)程內(nèi)的基本調(diào)度單位,也可以稱為輕量級(jí)進(jìn)程
由于線程共享進(jìn)程的資源和地址空間,因此在對(duì)這些資源進(jìn)行操作時(shí),必須考慮到線程間資源訪問(wèn)的唯一性問(wèn)題,這里介紹的是POSIX中線程同步的方法,主要有互斥鎖和信號(hào)量的方式
互斥鎖只有兩種狀態(tài),就是上鎖和解鎖?;コ怄i使得共享資源按序在各個(gè)線程中操作??煞譃?#xff1a;快速鎖、遞歸互斥鎖、檢錯(cuò)互斥鎖
信號(hào)量也是操作系統(tǒng)中所用到的PV原語(yǔ),它廣泛用于進(jìn)程或線程間的同步與互斥,本質(zhì)上是非負(fù)的整數(shù)計(jì)數(shù)器,當(dāng)信號(hào)量sem的值大于或等于0時(shí),該線程具有公共資源的訪問(wèn)權(quán)限?;コ馀c同步的區(qū)別在于,互斥用的是同一個(gè)信號(hào)量,同步反之。
#include #include #include void *pthread_2(void *param){ int i; // pthread_cancel(*(pthread_t *)param); // 取消th1線程,那么就不會(huì)去執(zhí)行pthread_1函數(shù)了 for (i = 0; i < 10; i++) { printf("我是線程2:%d/n", i); sleep(1); if(i == 5) { pthread_exit("exit"); } }}void *pthread_1(void *param){ pthread_cancel(*(pthread_t *)param); // 根據(jù)創(chuàng)建線程的函數(shù),會(huì)先執(zhí)行pthread_2一次然后回到pthread_1函數(shù) // 但是又把th2傳過(guò)來(lái),把th2線程取消掉 while (1) { printf("我是線程1/n"); sleep(1); } }int main(int argc, char *argv[]){ pthread_t th1,th2; printf("主進(jìn)程,下面開(kāi)始創(chuàng)建線程/n"); pthread_create(&th1, NULL, pthread_1, (void *)&th2); // 創(chuàng)建線程標(biāo)識(shí)符為th1,pthread_1是線程起始地址 pthread_create(&th2, NULL, pthread_2, (void *)&th1); // 創(chuàng)建線程標(biāo)識(shí)符為th2,pthread_2是線程起始地址,把th1傳到pthread_2中 printf("線程創(chuàng)建結(jié)束/n"); pthread_join(th1, NULL); // 將線程掛起,等待結(jié)束 pthread_join(th2, NULL);}
#include #include #include pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥鎖// 創(chuàng)建快速互斥鎖int flag = 0;void *pthread_2(void *param){ int i; pthread_mutex_lock(&mutex); // 鎖住線程資源 for (i = 0; i < 10; i++) { printf("我是線程2:%d/n", i); sleep(1); } pthread_mutex_unlock(&mutex); // 解鎖}void *pthread_1(void *param){ int i; pthread_mutex_lock(&mutex); for (i = 0; i < 10; i++) { printf("我是線程1:%d/n", i); sleep(1); } pthread_mutex_unlock(&mutex);}int main(int argc, char *argv[]){ pthread_t th1,th2; //pthread_mutex_init(&mutex, PTHREAD_MUTEX_INITIALIZER); printf("主進(jìn)程,下面開(kāi)始創(chuàng)建線程/n"); pthread_create(&th1, NULL, pthread_1, NULL); pthread_create(&th2, NULL, pthread_2, (void *)&th1); // 會(huì)先去執(zhí)行th1的線程 printf("線程創(chuàng)建結(jié)束/n"); pthread_join(th1, NULL); // 將線程吊起 pthread_join(th2, NULL);}
#include #include #include #include sem_t sem;//sem信號(hào)量實(shí)現(xiàn)三個(gè)線程互斥void *pthread_3(void *param){ int i; sem_wait(&sem); //sem = sem -1; for (i = 0; i < 10; i++) { printf("我是線程3:%d/n", i); sleep(1); } sem_post(&sem); //sem = sem + 1; }void *pthread_2(void *param){ int i; sem_wait(&sem); //sem = sem -1; for (i = 0; i < 10; i++) { printf("我是線程2:%d/n", i); sleep(1); } sem_post(&sem); //sem = sem + 1; }void *pthread_1(void *param){ int i; sem_wait(&sem); //sem = sem -1; for (i = 0; i < 10; i++) { printf("我是線程1:%d/n", i); sleep(1); } sem_post(&sem); //sem = sem + 1; }int main(int argc, char *argv[]){ pthread_t th1,th2, th3; sem_init(&sem, 0, 1); // 信號(hào)量初始化1 printf("主進(jìn)程,下面開(kāi)始創(chuàng)建線程/n"); pthread_create(&th1, NULL, pthread_1, NULL); pthread_create(&th2, NULL, pthread_2, NULL); // 首先去執(zhí)行th1線程 pthread_create(&th3, NULL, pthread_3, NULL); printf("線程創(chuàng)建結(jié)束/n"); pthread_join(th1, NULL); // 將線程掉起 pthread_join(th2, NULL); pthread_join(th3, NULL);}
#include #include #include #include sem_t sem1, sem2, sem3;//3個(gè)線程1,2,3//執(zhí)行順序 3 1 2void *pthread_3(void *param){ int i; sem_wait(&sem1); //sem = sem -1; for (i = 0; i < 10; i++) { printf("我是線程3:%d/n", i); sleep(1); } sem_post(&sem3); //sem = sem + 1;}void *pthread_2(void *param){ int i; sem_wait(&sem2); //sem = sem -1; for (i = 0; i < 10; i++) { printf("我是線程2:%d/n", i); sleep(1); } sem_post(&sem1); //sem = sem + 1;}void *pthread_1(void *param){ int i; sem_wait(&sem3); //sem = sem -1; for (i = 0; i < 10; i++) { printf("我是線程1:%d/n", i); sleep(1); } sem_post(&sem2); //sem = sem + 1;}int main(int argc, char *argv[]){ pthread_t th1, th2, th3; sem_init(&sem1, 0, 1); sem_init(&sem2, 0, 0); sem_init(&sem3, 0, 0); printf("主進(jìn)程,下面開(kāi)始創(chuàng)建線程/n"); pthread_create(&th1, NULL, pthread_1, NULL); pthread_create(&th2, NULL, pthread_2, NULL); pthread_create(&th3, NULL, pthread_3, NULL); // 初始化后,sem1 = 0 ,sem2 ,sem3 =-1 printf("線程創(chuàng)建結(jié)束/n"); pthread_join(th1, NULL); pthread_join(th2, NULL); pthread_join(th3, NULL);}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/121629.html
摘要:大家好,我是冰河有句話叫做投資啥都不如投資自己的回報(bào)率高。馬上就十一國(guó)慶假期了,給小伙伴們分享下,從小白程序員到大廠高級(jí)技術(shù)專家我看過(guò)哪些技術(shù)類書(shū)籍。 大家好,我是...
摘要:最寒冷,面試跳槽不能等馬上就月份了,所謂的金三銀四招聘季。在中有兩種模式,分別是線程池和信號(hào)量,說(shuō)到這里大家明白了吧,信號(hào)量的作用。感興趣的同學(xué)可以去了解下,講了線程,線程池,鎖,,等內(nèi)容。 2019最寒冷,面試跳槽不能等 馬上就3月份了,所謂的金三銀四招聘季。2019年也許是互聯(lián)網(wǎng)最冷清的一年,很多知名的大型互聯(lián)網(wǎng)公司都裁員過(guò)冬。當(dāng)然也有一些公司還在持續(xù)招人的,比如阿里就宣稱不裁員,...
摘要:定律在那篇最流行的編程語(yǔ)言能做什么里,我們列舉了在不同領(lǐng)域的使用情況,今天讓我們來(lái)詳解一下在物聯(lián)網(wǎng)中的應(yīng)用。這個(gè)硬件層決定了物聯(lián)網(wǎng)應(yīng)用比應(yīng)用更加復(fù)雜。這時(shí),我開(kāi)始關(guān)注實(shí)現(xiàn)物聯(lián)網(wǎng)應(yīng)用的可能性。 凡是能用JavaScript寫(xiě)出來(lái)的,最終都會(huì)用JavaScript寫(xiě)出來(lái)。 —— Atwood定律 在那篇《最流行的編程語(yǔ)言JavaScript能做什么?》里,我們列舉了JavaScript在不...
閱讀 735·2023-04-25 19:43
閱讀 3981·2021-11-30 14:52
閱讀 3807·2021-11-30 14:52
閱讀 3871·2021-11-29 11:00
閱讀 3802·2021-11-29 11:00
閱讀 3904·2021-11-29 11:00
閱讀 3580·2021-11-29 11:00
閱讀 6182·2021-11-29 11:00