Linux 執行緒安全(二)

2021-10-02 19:35:34 字數 2061 閱讀 7113

標頭檔案

#include
1.定義

sem_t sem;
2.初始化

sem_init(sem_t * sem,int pshared,int value)

sem:傳入訊號量的位址

pshared:0代表執行緒 1代表程序

value:實際資源個數,用於訊號量初始化

3.等待

sem_wait(sem_t* sem)----沒有資源就阻塞等待,等待訊號量,將訊號量計數器的值-1

sem_trywait(sem_t* sem)----沒有資源就報錯返回

4.喚醒(發布訊號量,資源使用完畢,可以歸還資源,訊號量計數器+1)

int sem_post(sem_t* sem)
5.銷毀

int sem_destroy(sem_t* sem)
#include #include #include #include #include #define size 1

#define threadcount 4

class ringqueue

~ringqueue()

void push(int& data)

void pop(int* data)

private:

std::vectorvec_;

size_t capacity_;

int poswrite_;//讀位置

int posread_;//寫位置

//同步功能的訊號量

//生產者的訊號量

sem_t prosem_;

//消費者的訊號量

sem_t consem_;

//實現互斥

sem_t locksem_;

};void* prostart(void* arg)

return null;

}void* constart(void* arg)

return null;

}int main()

ret = pthread_create(&con_tid[i], null, constart, (void*)rq);

if(ret != 0)

}for(i = 0; i < threadcount; i++)

delete rq;

return 0;

}

makefile

g++$^ -o $@ -g -lpthread
細則

問題1:已經有多個執行緒以讀模式獲取讀寫鎖,這時,有乙個執行緒想以寫模式獲取讀寫鎖。

a:阻塞該程序,直到所有以讀模式開啟的讀寫鎖全部釋放。

問題2:已經有多個執行緒以讀模式獲取讀寫鎖,這時,有乙個執行緒想以寫模式獲取讀寫鎖,後面也有一些想讀的執行緒。會不會導致寫模式的執行緒一直阻塞?

a:通常不會長時間阻塞寫模式的執行緒。作業系統通常會阻塞後來想讀的執行緒,保證寫模式的執行緒不會等待太長時間。也避免鎖資源被長時間的占用。

1.定義

pthread_rwlock_t rwlock;
2.初始化

pthread_rwlock_init(pthread_rwlock_t*,pthread_rwlockattr_t*)
3.加鎖

pthread_rwlock_rdlock(pthread_rwlock_t* )

pthread_rwlock_wrlock(pthread_rwlock_t* )

4.解鎖

pthread_rwlock_unlock(pthread_rwlock_t* )
5.銷毀

pthread_rwlock_destroy(pthread_rwlock_t* )

執行緒安全二

在保證執行緒安全的時候,除了synchronized和lock,也需要用到其他的一些關鍵字,可以針對不同的場景使用。使用final修飾變數,表示變數只能被賦值一次,賦值之後值不再改變,因此使用final修飾基本資料型別的時候,自然就是執行緒安全的。private final int value 另外...

Linux 執行緒安全

概念 多個執行緒同時對臨界資源進行訪問,不會造成資料二義問題 實現 同步 互斥 同步 對臨界資源訪問的時序合理性 互斥 對臨界資源同一時間訪問的唯一性 執行緒間互斥的實現 互斥鎖mutex pthread mutex t mutex 定義互斥鎖變數 pthread mutex init pthrea...

Linux 執行緒安全

多個執行緒同時訪問臨界資源,產生二義性。如何保證互斥鎖的原子訪問 互斥鎖使用過程 1.定義互斥鎖變數 pthread mutex t mutex1 2.初始化互斥鎖 int pthread mutex init pthread mutex t restrict mutex,const pthread...