標頭檔案
#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...