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