多線程與互斥鎖
轉載自博主:https://blog.csdn.net/qq_27312943/article/details/79084781
有的linux版本沒有包含以下函數的man手冊,需要手動下載!Ubuntu下載方法:apt-get install manpages-posix-dev
-
互斥鎖
主要作用是關鍵段代碼保護,
上鎖
訪問
解鎖
互斥鎖機制主要包括以下基本函數
互斥鎖初始化 pthread_mutex_init()
互斥鎖上鎖 pthread_mutex_lock()
互斥鎖判斷上鎖 pthread_mutex_trylock()
互斥鎖解鎖 pthread_mutex_unlock()
刪除互斥鎖 pthread_mutex_destory()
-
實例
/*在thread.c的基礎上加入互斥鎖功能,*/
//多線程是并發執行,沒有固定的順序
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#define THREAD_NUMBER 3 /*線程數*/
#define REPEAT_NUMBER 5 /*每個線程中的小任務數*/
#define DELAY_TIME_LEVELS 10.0 /*小任務之間的最大時間間隔*/
pthread_mutex_t mutex;
void *thrd_func(void *arg)
{
//線程函數例程
int thrd_num=(int)arg;
int delay_time=2;
int count=0;
int res;
//互斥鎖上鎖
/*********************
函數原型: int pthread_mutex_lock(pthread_mutex_t *mutex)
函數參數: mutex 互斥鎖
返回值: 成功 0
失敗 -1
*********************/
res=pthread_mutex_lock(&mutex);
if(res)
{
printf("thread %d lock filed\n",thrd_num);
pthread_exit(NULL);
}
printf("thread %d is starting\n",thrd_num);
for(count=0;count<REPEAT_NUMBER;count++)
{
/*RAND_MAX 是 <stdlib.h> 中偽隨機數生成函數 rand 所能返回的最大數值*/
//delay_time=(int)(rand()* DELAY_TIME_LEVELS/(RAND_MAX))+1;
sleep(delay_time);
printf("thread %d: job %d,delay=%d\n",thrd_num,count,delay_time);
}
printf("Thread %d finished\n",thrd_num);
pthread_mutex_unlock(&mutex);
/*******************
函數原型:void pthread_exit(void *retval)
函數參數: retval線程結束時的返回值,可由其他函數如pthread_join()獲取
******************/
pthread_exit(NULL);
}
int main()
{
pthread_t thread[THREAD_NUMBER];
int no=0,res;
void *thrd_ret;
srand(time(NULL));
//初始化互斥鎖
/******************************
函數原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
函數參數: mutex 互斥鎖
attr PTHREAD_MUTEX_INITIALIZER 創建快速互斥鎖
PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP 創建遞歸互斥鎖
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP 創建檢錯互斥鎖
函數返回值: 成功 0
失敗 返回錯誤碼
***************************/
pthread_mutex_init(&mutex,NULL);
for(no=0;no<THREAD_NUMBER;no++)
{
/*創建多線程*/
res=pthread_create(&thread[no],NULL,thrd_func,(void*)no);
if(res!=0)
{
//創建線程失敗
printf("thread %d join failed\n",no);
exit(res);
}
}
printf("creat threads success\n waiting for threads to finish...\n");
for(no=0;no<THREAD_NUMBER;no++)
{
//等待線程結束
res=pthread_join(thread[no],&thrd_ret);
if(!res)
{
printf("thread %d joined\n",no);
}
else
{
printf("thread %d joined fail\n",no);
}
//互斥鎖解鎖
/*********************
函數原型:int pthread_mutex_unlock(pthread_mutex_t *mutex)
函數參數:mutex 互斥鎖
返回值: 成功 0
**********************/
//pthread_mutex_unlock(&mutex);
}
//消除互斥鎖
pthread_mutex_destroy(&mutex);
return 0;
}
-
執行結果
-
如果不加互斥鎖執行結果:
thread 2: job 0,delay=2
thread 1: job 0,delay=2
thread 0: job 0,delay=2
thread 2: job 1,delay=2
thread 1: job 1,delay=2
thread 0: job 1,delay=2
thread 1: job 2,delay=2
thread 2: job 2,delay=2
thread 0: job 2,delay=2
thread 2: job 3,delay=2
thread 1: job 3,delay=2
thread 0: job 3,delay=2
thread 1: job 4,delay=2
Thread 1 finished
thread 2: job 4,delay=2
Thread 2 finished
thread 0: job 4,delay=2
Thread 0 finished
thread 0 joined
智能推薦
C語言多線程互斥鎖
互斥鎖是為了防止多個線程同時操作臨界資源,下面看看用法: 運行結果: 可以看出線程的運行順序是不確定的,一個線程對資源上鎖了,其他線程想上鎖只能被阻塞。加入去掉互斥鎖的結果如下: 可以看出同一個線程內操作value的前后值是異常的。...
linux多線程 -- 讀寫互斥鎖(7)
一、讀寫鎖是什么? 讀寫鎖其實還是一種鎖,是給一段臨界區代碼加鎖,但是此加鎖是在進行寫操作的時候才會互斥,而在進行讀的時候是可以共享的進行訪問臨界區的。 讀寫鎖和互斥量(互斥鎖)很類似,是另一種線程同步機制,但不屬于POSIX標準,可以用來同步同一進程中的各個線程。當然如果一個讀寫鎖存放在多個進程共享的某個內存區中,那么還可以用來進行進程間的同步, 讀寫鎖的使用規則: 只要沒有寫模式下的加鎖,任意...
java多線程:使用Lock接口實現自定義鎖,互斥鎖與重入鎖
1.Lock接口的三個實現類 ReentrantLock(可重入鎖) ReadLock(讀鎖) WriteLock(寫鎖) 2.自定義互斥鎖實現 通過實現Lock接口的lock()方法和unlock()方法來完成自定義實現 ps:主要思想就是設置一個狀態量,根據狀態量來判斷是否鎖被占用,如果被占用就wait(),如果沒被占用就使用。 自定義互斥鎖實現 測試代碼 控制臺輸出: 10000...
多線程-------線程的同步與互斥
一、什么是互斥量(mutex) 先來看一段代碼:操作共享變量會有問題的售票系統 Makefile mypthread.c 運行之: 線程不斷買票,買到后面時出現-1,-2 -1 -2意味著什么 意味著票務系統出錯了,(數據不一致問題:臨界資源有可能在同一時間被多個線程訪問,無法保證原子性) 怎樣解決:加鎖:實現互斥(1、保證一個線程在訪問臨界資源的時候,其他線程不能訪問;2、如果線程不在臨界區中執...
多線程與并發----線程互斥技術
1、使用synchronized代碼塊 2、使用synchronized方法 3、分析靜態方法鎖使用的同步監視器對象是什么? 4、wait與notify實現線程間的通信 例一:使用內部類和兩個線程交替不停的打印lisi和zhangsan兩個名字 運行結果為: lisi zhangsan zhangsan lisi lisi zhangsan lisi 使用synchronized代碼塊使用sync...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...