• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 多線程與互斥鎖

    標簽: 線程  互斥鎖  c  Linux

    轉載自博主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

    版權聲明:本文為qq_40585834原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_40585834/article/details/81429270

    智能推薦

    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...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡