1. 程式人生 > >互斥量和條件變數

互斥量和條件變數

1、如何利用2個條件變數實現執行緒同步?

  思路:就是來回的利用pthread_cond_signal()函式,當一方被阻塞時,喚醒函式可以喚醒pthread_cond_wait()函式,只不過pthread_cond_wait()這個方法要執行其後的語句,必須遇到下一個阻塞(也就是pthread_cond_wait()方法時),才執行喚醒後的其後語句。

程式碼如下:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#include<stdio.h>
#include<unistd.h>#include<stdlib.h>#include<string.h>#include<pthread.h>#define MAX_NUM 2static int count = 1;pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;pthread_cond_t js = PTHREAD_COND_INITIALIZER;pthread_cond_t os = PTHREAD_COND_INITIALIZER;void* A(void *arg){pthread_mutex_lock(&mutex);
while(count <= MAX_NUM){if(count%2 == 1){ printf("A = %d\n", count);count++;pthread_cond_signal(&os);sleep(5);printf("bbbbbbbbbbbbbbbbbbbbbbbbbbb\n");}else{printf("ccccccccccccccccccccccccccc\n");pthread_cond_wait(&js, &mutex);printf("ddddddddddddddddddddddddddd\n");}pthread_mutex_unlock(&mutex);
}}void* B(void *arg){pthread_mutex_lock(&mutex);while(count <= MAX_NUM){if(count%2 == 0){printf("B = %d\n", count);count++;pthread_cond_signal(&js);}else{pthread_cond_wait(&os, &mutex);printf("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");}}pthread_mutex_unlock(&mutex);}int main(void){pthread_t tid1, tid2;pthread_create(&tid2, NULL, B, NULL);sleep(1);pthread_create(&tid1, NULL, A, NULL);   pthread_join(tid1, NULL);pthread_join(tid2, NULL);return 0;}

執行結果

wKiom1fisA-Td37IAABNdnFhnsM941.png-wh_50

上面的這個程式就是:2個條件變數對一個互斥量的操作。signal()傳送喚醒wait(),wait()之後的語句暫時不執行,直到下一次遇到wait()時,阻塞,返回執行喚醒的wait()之後的語句。

2、怎麼建立10個執行緒的開始執行和結束過程?

  利用2個條件變數和1個互斥量即可實現。

程式碼如下:

1234567891011121314151617181920212223242526272829303132333435363738394041#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>#include<pthread.h>pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

相關推薦

Linux多執行緒學習(2)--執行緒的同步與互斥及死鎖問題(互斥條件變數)

Linux多執行緒學習總結 一.互斥量 1.名詞理解 2.什麼是互斥量(mutex) 3.互斥量的介面 3.1 初始化訊號量 3.2 銷燬訊號量 3.3 互斥量加鎖和解鎖

互斥條件變數實現生產者消費者模型

/*producer and constmer*/ #include<stdio.h> #include<pthread.h> #include<string.h>

關於互斥條件變數

條件變數一般用於阻塞執行緒以及給執行緒發訊號,解除阻塞。而條件變數往往和互斥量一起使用,因為條件變數在阻塞的時候會有一個加鎖解鎖的過程。還記得以前寫過一個生產者——消費者的例項,那時候對一些問題還不是很理解。下面是一個簡單的練習例項,以及最後總結遇到的一些問題。

互斥條件變數

1、如何利用2個條件變數實現執行緒同步?  思路:就是來回的利用pthread_cond_signal()函式,當一方被阻塞時,喚醒函式可以喚醒pthread_cond_wait()函式,只不過pthread_cond_wait()這個方法要執行其後的語句,必須遇到下一個阻塞

linux下用互斥條件變數來實現讀寫鎖

以下內容來源自UNP卷二的第八章 讀寫鎖的概念( the conception of read-write lock ) (1)只要沒有執行緒持有某個給定的讀寫鎖用於寫,那麼任意數目的執行緒可以持有該執行緒用於讀 (2)僅當沒有執行緒持有某個給定的讀寫鎖用於讀或用於寫,才能分配該

通過互斥條件變數實現佇列的無sleep生產與消費

昨天轉了一篇文章將條件變數與互斥鎖的結合使用,今天給大家摳出曾經學到的一段高效的處理訊息的demo,通過互斥鎖實現安全佇列,通過條件變數實現佇列的工作與休息。 目錄結構: 簡單介紹: SignalThread是封裝好的執行緒類,我們所做的核心工作都是在這裡完成,其他類也是服務於這裡;

互斥條件變數與pthread_cond_wait()函式的使用,詳解(二)

1.Linux“執行緒”      程序與執行緒之間是有區別的,不過linux核心只提供了輕量程序的支援,未實現執行緒模型。Linux是一種“多程序單執行緒”的作業系統。Linux本身只有程序的概念,而其所謂的“執行緒”本質上在核心裡仍然是程序。      大家知道,

互斥條件變數與pthread_cond_wait()函式的使用

1.Linux“執行緒”      程序與執行緒之間是有區別的,不過linux核心只提供了輕量程序的支援,未實現執行緒模型。Linux是一種“多程序單執行緒”的作業系統。Linux本身只有程序的概念,而其所謂的“執行緒”本質上在核心裡仍然是程序。      大家知道,程序

Linux 學習筆記—執行緒同步之互斥條件變數

執行緒同步(同步的意思是協同步調) 執行緒同步機制包括互斥,讀寫鎖以及條件變數等 3.2.1 互斥量(互斥鎖) **互斥量本質是一把鎖,在訪問公共資源前對互斥量設定(加鎖),確保同一時間只有一個執行緒訪問資料,在訪問完成後再釋放(解鎖)互斥量。**在互斥量加鎖之

Linux下互斥條件變數詳細解析

引用下POSIX的RATIONALE: Condition Wait Semantics It is important to note that when pthread_cond_wait() andpthread_cond_timedwait() return without error, the as

執行緒私有資料TSD——一鍵多值技術,執行緒同步中的互斥條件變數

一:執行緒私有資料: 執行緒是輕量級程序,程序在fork()之後,子程序不繼承父程序的鎖和警告,別的基本上都會繼承,而vfork()與fork()不同的地方在於vfork()之後的程序會共享父程序的地址空間,但是有了寫實複製(fork()之後的子程序也不會直接

Linux使用互斥條件變數實現讀寫鎖(寫優先)

(1)只要沒有執行緒持有某個給定的讀寫鎖用於寫,那麼任意數目的執行緒可以持有該讀寫鎖用於讀(2)僅當沒有執行緒持有某個讀寫鎖用於讀或用於寫時,才能分配該讀寫鎖用於寫換一種說法就是,只要沒有執行緒在修改(寫)某個給定的資料,那麼任意數目的執行緒都可以擁有該資料的訪問權(讀)。僅

Linux程序通訊[2]-互斥條件變數

概述 上一篇介紹了共享記憶體,已經屬於比較高階的層次。本篇介紹一下多執行緒/多程序最基礎的問題,同步。 為了允許線上程或程序間共享資料,同步常常是必需的,也就是我們常說要用鎖(當然鎖通常也是效能瓶頸,現在無鎖架構正在越發流行)。互斥鎖和條件變數則是同步的基本組成部分。互斥鎖和條件變數在同一程序下的所有

C++11學習筆記-----互斥以及條件變數的使用

在多執行緒環境中,當多個執行緒同時訪問共享資源時,由於作業系統CPU排程的緣故,經常會出現一個執行緒執行到一半突然切換到另一個執行緒的情況。以多個執行緒同時對一個共享變數做加法運算為例,自增的彙編指令大致如下,先將變數值存放在某個暫存器中(eax),然後對暫存器

多執行緒用互斥條件變數實現生產者消費者-------迴圈任務佇列

互斥鎖與條件變數簡介 在多執行緒的環境中,全域性變數會被各執行緒共享,因此在操作全域性變數的時候需要採用鎖機制,在linux裡最常用的鎖就是互斥鎖,互斥鎖使用方法如下 <pre name="code" class="cpp">//執行緒A pthread_mut

Linux C互斥條件變數(POSIX標準)

       與程序類似,執行緒也存在同步的問題,當多個控制執行緒共享相同的記憶體時,需要確保每個執行緒看到一致的資料檢視,如果每個執行緒使用的變數都是其他執行緒不會讀取或修改的(比如執行緒私有資料),就不會存在一致性問題。通常來說使用者可以使用互斥量(互斥鎖)或者的條件變數

Linux多執行緒消費者生產者模型例項(互斥條件變數使用)

條件變數簡單介紹: 條件變數是執行緒可以使用的另一種同步機制。條件變數與互斥量一起使用的時候,允許執行緒以無競爭的方式等待特定的條件發生。條件本身是由互斥量保護的。執行緒在改變條件變數狀態前必須先鎖住互斥量。另一種是動態分配的條件變數,則用pthread_cond_ini

Linux下多執行緒程式設計互斥條件變數的簡單使用

Linux下的多執行緒遵循POSIX執行緒介面,稱為pthread。編寫Linux下的多執行緒程式,需要使用標頭檔案pthread.h,連結時需要使用庫libpthread.a。執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位。執行緒

C++ 併發程式設計之互斥條件變數的效能比較

介紹 本文以最簡單生產者消費者模型,通過執行程式,觀察該程序的cpu使用率,來對比使用互斥鎖 和 互斥鎖+條件變數的效能比較。 本例子的生產者消費者模型,1個生產者,5個消費者。 生產者執行緒往佇列裡放入資料,5個消費者執行緒從佇列取資料,取資料前需要判斷一下佇列中是否有資料,這個佇列是全域性佇列,是執行緒間

Linux多執行緒程式設計---執行緒間同步(互斥鎖、條件變數、訊號讀寫鎖)

本篇博文轉自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。  下面是思維導