執行緒間通訊《互斥鎖,讀寫鎖》

2021-08-22 12:12:00 字數 2941 閱讀 9978

1、互斥鎖

為了保護共享資源,使我們執行緒可以單獨使用這個共享資源,使用之前先上鎖,那其他程序要使用的時候,就需要等待到這個執行緒用完之後,需要開鎖。

互斥鎖的使用:

幫助文件預設沒有安裝,我們需要手動安裝:sudo apt-get install manpages-posix-dev

宣告這個互斥鎖:

pthread_mutex_t  m;

初始化這個互斥鎖:

int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);//注意引數取位址;&m

第二個引數:是這個鎖的屬性,我們讓它是預設的屬性,這裡設定為null

返回值:成功返回0

失敗返回-1

上鎖:鎖住某個資源

int pthread_mutex_lock(pthread_mutex_t *mutex); 這個函式是阻塞型,引數傳遞的是這個鎖的指標。

int pthread_mutex_trylock(pthread_mutex_t *mutex); 這個是非阻塞型的,引數傳遞的是這個鎖的指標。

返回值:成功返回0

失敗返回-1

解鎖:int pthread_mutex_unlock(pthread_mutex_t *mutex); 這個是解鎖的函式,引數傳遞的是這個鎖的指標。

返回值:成功返回0

失敗返回-1

銷毀這個互斥鎖:

int pthread_mutex_destroy(pthread_mutex_t *mutex);

第乙個引數:傳遞的是這個鎖的指標。

返回值:成功返回0

失敗返回-1

互斥鎖:現象:列印aaaaaaabbbbb//**中的兩種方式都可以;

#include

#include

#include

pthread_mutex_t m;

void *func(void *arg)

pthread_mutex_unlock(&m);

pthread_exit(null);

}int main()

// pthread_mutex_lock(&m);

pthread_create(&tid1,null,func,"aaaaaaaaaaaaaaaa");

pthread_join(tid1,null);

// pthread_mutex_unlock(&m);

pthread_create(&tid2,null,func,"bbbbbbbbbbbbbbb");

pthread_join(tid2,null);

printf("\n");

pthread_mutex_destroy(&m);

return 0;

}2、讀寫鎖

為了保護共享資源的訪問,但是這裡區分了讀的訪問和寫的訪問。

先宣告:pthread_rwlock_t rwlock;

初始化:int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);

第二個引數:是這個鎖的屬性,我們讓它是預設的屬性,這裡設定為null

返回值:成功返回0

失敗返回-1

上鎖:int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); 上的是讀鎖

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock); 上的是讀鎖,非阻塞型的

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock); 上的是寫鎖,非阻塞型的

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); 上的是寫鎖,阻塞型的,如果上了這個寫鎖,它的作用和互斥鎖是一樣。

解鎖:pthread_rwlock_unlock

銷毀: int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

第乙個引數:傳遞的是這個鎖的指標

返回值:成功返回0

失敗返回-1

讀寫鎖:當為讀鎖的時候都可以訪問,所以隨機列印abcabcabc,當為寫鎖的時候是互斥的,所以可以列印aaaaabbbbbbcccccccc

#include

#include

#include

pthread_rwlock_t rwlock;

void *func(void *arg)

pthread_rwlock_unlock(&rwlock);

pthread_exit(null);

}int main()

// pthread_mutex_lock(&m);

pthread_create(&tid1,null,func,"aaaaaaaaaaaaaaaa");

// pthread_mutex_unlock(&m);

pthread_create(&tid2,null,func,"bbbbbbbbbbbbbbb");

pthread_create(&tid3,null,func,"ccccccccccccccc");

pthread_join(tid2,null);

pthread_join(tid1,null);

pthread_join(tid3,null);

printf("\n");

pthread_rwlock_destroy(&rwlock);

return 0;

}

執行緒間互斥鎖

一 兩種使用方式 1.靜態方式 pthread mutex t mtx pthread mutex initializer 2.動態方式 include int pthread mutex init pthread mutex t mutex,const pthread mutexattr t at...

執行緒狀態 互斥鎖 通訊

標籤 空格分隔 多執行緒 void touchesbegan nsset touches withevent uievent event void run 注意點互斥鎖和自旋鎖不同點 盡量避免多執行緒搶奪同一塊資源,盡量將加鎖 資源搶奪的業務邏輯交給伺服器端處理,減小移動客戶端的壓力 void pe...

05執行緒通訊 互斥鎖

1.建立乙個互斥鎖 int pthread mutex init ptread mutex t mutex,const pthread mutexattr t attr 成功返回0 失敗eof 2.申請乙個互斥鎖 int pthread mutex lock ptread mutex t mutex...