日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Linux编程练习 --多线程3--mutex

發布時間:2023/12/10 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux编程练习 --多线程3--mutex 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

互斥指互相排斥的鎖,是一種信號量,常用來防止兩個進程或線程在同一時刻訪問相同的共享資源

????????

1.數據類型:

?Linux,?線程的互斥量數據類型是pthread_mutex_t,我們定義一個互斥數據可以這樣:

????????????? pthread_mutex_t mutex;

?

2.函數說明:
頭文件:?????pthread.h

(1).互斥鎖初始化:

?

函數原型:?int pthread_mutex_init (pthread_mutex_t* mutex,

?????????????????????????????????const pthread_mutexattr_t*???mutexattr);
函數傳入值:? mutex:互斥鎖。

????????????????mutexattr:PTHREAD_MUTEX_INITIALIZER:創建快速互斥鎖。

????????????????PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP:創建遞歸互斥鎖。

???????????????????PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP:創建檢錯互斥鎖。

函數返回值:?成功:0

???????????????????出錯:-1?
(2).互斥操作函數

int pthread_mutex_lock(pthread_mutex_t* mutex);//上鎖

int pthread_mutex_trylock (pthread_mutex_t* mutex);//只有在互斥被鎖住的情況下才阻塞

int pthread_mutex_unlock (pthread_mutex_t* mutex);//解鎖

int pthread_mutex_destroy (pthread_mutex_t* mutex);//清除互斥鎖

函數傳入值:??????????? mutex:互斥鎖。

函數返回值:???????????成功:0

????????????????????????????? 出錯:-1

3.使用形式:

struct mutex mutex;

mutex_init(&mutex); /*定義*/

...
mutex_lock(&mutex); /*獲取互斥鎖*/

... /*臨界資源*/

mutex_unlock(&mutex); /*釋放互斥鎖*/

?

?

最后進行一個練習:我們創建兩個線程,分別訪問全局變量gnum,并且修改它,打印出來

[cpp]?view plaincopy
  • /*mutex.c*/??
  • #include?<stdlib.h>????
  • #include?<stdio.h>????
  • #include?<pthread.h>????
  • #include?<errno.h>?????
  • /*全局變量*/??
  • int?gnum?=?0;??
  • /*互斥量?*/??
  • pthread_mutex_t?mutex;??
  • /*聲明線程運行服務程序*/??
  • static?void?pthread_func_1?(void);?????
  • static?void?pthread_func_2?(void);?????
  • ????
  • int?main?(void)?????
  • {?????
  • ?/*線程的標識符*/??
  • ??pthread_t?pt_1?=?0;?????
  • ??pthread_t?pt_2?=?0;?????
  • ??int?ret?=?0;?????
  • ??/*互斥初始化*/??
  • ??pthread_mutex_init?(&mutex,?NULL);???
  • ??/*分別創建線程1、2*/??
  • ??ret?=?pthread_create?(&pt_1,??????????//線程標識符指針??
  • ?????????????????????????NULL,??????????//默認屬性??
  • ????????????????????????(void?*)pthread_func_1,//運行函數??
  • ????????????????????????NULL);??????????//無參數??
  • ??if?(ret?!=?0)?????
  • ??{?????
  • ?????perror?("pthread_1_create");?????
  • ??}?????
  • ????
  • ??ret?=?pthread_create?(&pt_2,??????????//線程標識符指針??
  • ????????????????????????NULL,???????????//默認屬性????
  • ????????????????????????(void?*)pthread_func_2,?//運行函數??
  • ????????????????????????NULL);??????????//無參數??
  • ??if?(ret?!=?0)?????
  • ??{?????
  • ?????perror?("pthread_2_create");?????
  • ??}?????
  • ??/*等待線程1、2的結束*/??
  • ??pthread_join?(pt_1,?NULL);?????
  • ??pthread_join?(pt_2,?NULL);?????
  • ????
  • ??printf?("main?programme?exit!/n");????
  • ??return?0;?????
  • }?????
  • /*線程1的服務程序*/??
  • static?void?pthread_func_1?(void)?????
  • {?????
  • ??int?i?=?0;?????
  • ???????
  • ??for?(;;)?????
  • ??{?????
  • ????printf?("This?is?pthread1!/n");??????
  • ????pthread_mutex_lock(&mutex);?/*獲取互斥鎖*/??
  • ????/*注意,這里以防線程的搶占,以造成一個線程在另一個線程sleep時多次訪問互斥資源,所以sleep要在得到互斥鎖后調用*/??
  • ????sleep?(1);????
  • ????/*臨界資源*/??
  • ????gnum++;??
  • ????printf?("Thread1?add?one?to?num:%d/n",gnum);??
  • ????pthread_mutex_unlock(&mutex);?/*釋放互斥鎖*/??
  • ??
  • ???????
  • ??}?????
  • }?????
  • /*線程2的服務程序*/???
  • static?void?pthread_func_2?(void)?????
  • {?????
  • ??int?i?=?0;?????
  • ????
  • ??for?(;;)?????
  • ??{?????
  • ????printf?("This?is?pthread2!/n");???
  • ????pthread_mutex_lock(&mutex);?/*獲取互斥鎖*/??
  • ????/*注意,這里以防線程的搶占,以造成一個線程在另一個線程sleep時多次訪問互斥資源,所以sleep要在得到互斥鎖后調用*/??
  • ????sleep?(1);??
  • ????/*臨界資源*/??
  • ????gnum++;??
  • ????printf?("Thread2?add?one?to?num:%d/n",gnum);??
  • ????pthread_mutex_unlock(&mutex);?/*釋放互斥鎖*/??
  • ????
  • ??}?????
  • ????
  • ??pthread_exit?(0);?????
  • }????
  • 然后編譯,運行,看到是線程1,2分別和平地訪問共享資源

    總結

    以上是生活随笔為你收集整理的Linux编程练习 --多线程3--mutex的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。