訊號量
訊號量是相互排斥鎖的公升級版把相互排斥鎖中1變成了n。舉個簡單的樣例:如果如今有10個人,有一部手機。這10個人都競爭來使用手機打**這就是相互排斥鎖。對於訊號量,如今可能是有4部手機,這10個人都競爭來使用手機打**。相比相互排斥鎖訊號量由1變成了4。訊號量相也就是作業系統中pv操作,它廣泛應用程序或者執行緒間的同步與相互排斥。
相關庫函式介紹
#include //所需標頭檔案
//初始化訊號量sem初始化的時候能夠指定訊號量的初始值,以及能否夠在多程序間共享value表示要訊號量初始值,pshared表示是否再多程序之前共享。
0表示不在多程序間 共享,非0表示在多程序之間共享詳細能夠man sem_init //成功返回0,出錯返回-1 int sem_init(sem_t *sem, int pshared, unsigned int value); int sem_wait(sem_t *sem)//相當於p操作 int sem_try_wait(sem_t *sem)//相當於p操作。在訊號量值大於0時都能將訊號量的值減一,與上面sem_wait的差別是,在訊號值小於0時 int sem_post(sem_t *sem)//相當於v操作 int sem_getvalue(sem_t *sem)//用於得到訊號量的值 int sem_destory(sem_t *sem) //釋放訊號量
訊號量例項:生產者消費值
條件變數
條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包含兩個動作:乙個執行緒等待"條件變數的條件成立"而掛起;還有乙個執行緒使"條件成立"(給出條件成立訊號)。
為了防止競爭,條件變數的使用總是和乙個相互排斥鎖結合在一起。
條件變數型別為pthread_cond_t。
相關庫函式簡單介紹
#includeint pthread_cond_destroy(pthread_cond_t *cond);//條件變數的資源釋放
int pthread_cond_init(pthread_cond_t *cond,const pthread_condattr_t *attr);//條件變數的初始化
#includeint pthread_cond_timedwait(pthread_cond_t *restrict cond,pthread_mutex_t *mutex,
const struct timespec *abstime);
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
//等待某個條件是否成立。對於timewait()函式除了等待以外。能夠設定乙個時長。
int pthread_cond_signal(pthread_cond_t *cond);//種情況是僅僅有乙個執行緒收到後執行動作。
//活動執行緒僅僅須要喚醒第乙個正在睡眠的執行緒。如果您僅僅對佇列加入了乙個工作作業。
那麼僅僅須要喚醒乙個工作程式執行緒(再喚醒其他執行緒是不禮貌的!
) int pthread_cond_broadcast(pthread_cond_t *cond);//通過廣播的形式發給子執行緒訊息。子執行緒競爭執行。
#include #include #include #include struct msg ;
struct msg *head;
/* 條件變數 */
pthread_cond_t has_product = pthread_cond_initializer;
pthread_mutex_t lock = pthread_mutex_initializer;
void *consumer(void *p)
}void *producer(void *p)
}int main(int argc, char *ar**)
linux 執行緒 執行緒同步
因為執行緒獨自擁有的只有棧,其他的區域執行緒共同擁有。並且對共享區域的操作並不都是原子的。對共享區域的操作順序又是不確定的。就像建立兩個檔案描述符同時指向 同一檔案,並且連續向檔案中寫入那麼寫的東西可能是亂七八糟的。這時就需要執行緒對共享區的同步。而另一種情況是,多個執行緒的指令執行順序需要同步。這...
執行緒同步(二)
1 countdownlatch countdown倒計時,latch鎖 門閂 countdownlatch countdownlatch new countdownlatch 2 thread threada new thread new runnable thread threadb new t...
Linux執行緒同步
1.概要 執行緒的同步,發生在多個執行緒共享相同記憶體的時候,這時,要保證每個執行緒在每個時刻看到的共享資料是一致的。如果每個執行緒使用的變數都是其他執行緒不會使用的 read write 或者變數是唯讀的,就不存在一致性問題。但是,如果兩個或兩個以上的執行緒可以read write乙個變數時,就需...