久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

線程通信

 醉雨情 2015-06-02

線程互斥機制

Mutex變量就像一把“鎖”,,是線程同步和保護共享數據的主要方式 
Mutex可以用來阻止競爭 
Pthreads中Mutex的基本概念 
在任何時候,,只有一個線程能夠獲得Mutex 
盡管幾個線程想獲取一個Mutex,,但是只有一個線程能夠成功 
其他線程需要等待,,直到獲取Mutex的線程放棄Mutex 
線程必須輪流訪問需要保護的數據 
線程經常利用mutex來加鎖需要更新的全局變量,,這也是幾個線程需要同時更新全局變量時使用的安全方法 
這樣能保證在多線程環(huán)境下的全局變量的更新就如在單線程環(huán)境中一樣 
此全局變量的更新屬于“臨界區(qū)”

創(chuàng)建和初始化mutex 
使用mutex 
各線程嘗試獲取mutex 
但僅有一個線程能夠獲取mutex并擁有它 
擁有mutex的線程執(zhí)行需訪問臨界資源的特定處理例程 
擁有線程釋放mutex 
其他線程闡述獲取mutex 
重復上述步驟 
銷毀 mutex

mutex變量創(chuàng)建/銷毀函數

pthread_mutex_init(mutex,attr) 
pthread_mutex_destroy(mutex) 
pthread_mutexattr_init(attr) 
pthread_mutexattr_destroy(attr) 
  • 1
  • 2
  • 3
  • 4
  • 5

互斥鎖創(chuàng)建

聲明mutex變量:pthread_mutex_t類型
在使用前必須已經初始化(兩種方式)
靜態(tài)方式
pthread_mutex_t  mutex=PTHREAD_MUTEX_INITIALIZER
動態(tài)方式
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
返回值
成功返回0
失敗返回錯誤編號
說明
mutex初始時是unlocked(未加鎖的)的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

普通鎖(PTHREAD_MUTEX_TIMED_NP) 
默認值,當一個線程加鎖后,,其余請求鎖的線程形成一個等待隊列,,并在解鎖后按優(yōu)先級獲得鎖 
嵌套鎖(PTHREAD_MUTEX_RECURSIVE_NP) 
允許同一個線程對同一個鎖成功獲得多次,并通過多次unlock解鎖 
如果是不同線程請求,則在加鎖線程解鎖時重新競爭 
檢錯鎖(PTHREAD_MUTEX_ERRORCHECK_NP) 
如果同一個線程請求同一個鎖,,則返回EDEADLK,,否則與普通鎖動作相同 
適應鎖(PTHREAD_MUTEX_ADAPTIVE_NP) 
動作最簡單的鎖類型,僅僅等待鎖解鎖后重新競爭

互斥鎖的屬性

用于設置mutex對象屬性
如果使用它,,那么它一定是 pthread_mutexattr_t 類型 (可以設置NULL作為缺省的),。
pthreads標準定義三種可選的mutex屬性 
protocol: 利用特定的協(xié)議來防止mutex優(yōu)先級倒置 
prioceiling: 特定的mutex優(yōu)先級限制 
process-shared: 特定進程共享mutex 
說明
并不是所有的應用提供所有這三種mutex屬性 
屬性操作函數
pthread_mutexattr_init():創(chuàng)建mutex屬性對象
pthread_mutexattr_destroy():銷毀mutex屬性對象
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
函數原型
int  pthread_mutex_destroy(pthread_mutex_t *mutex)
銷毀一個互斥鎖
釋放它鎖占用的資源,且要求鎖當前處于開放狀態(tài)
  • 1
  • 2
  • 3
  • 4
  • 5

互斥鎖操作

加鎖
int pthread_mutex_lock(pthread_mutex_t *mutex);
若mutex已被其他線程加鎖,,該調用會阻塞線程直到mutex被解鎖 
嘗試加鎖
int pthread_mutex_trylock(pthread_mutex_t *mutex);
若mutex已經被加鎖,,該調用會立即返回一個“busy”錯誤碼
利用此調用可以防止在優(yōu)先級倒置所出現的死鎖 
解鎖
int pthread_mutex_unlock(pthread_mutex_t *mutex);
當擁有mutex的線程使用完保護資源后,應該調用該解鎖mutex,。在下面的情況中,,將返回一個錯誤 
mutex已解鎖
mutex被其他線程加鎖
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

條件變量

互斥鎖的缺點 
通過控制存取數據來實現線程同步 
線程需不斷輪詢條件是否滿足(忙等),消耗很多資源 
條件變量 
利用線程間共享的全局變量實現同步 
條件變量使線程睡眠等待特定條件出現(無需輪詢) 
使用方法 
通常條件變量和互斥鎖同時使用 
一個線程因等待“條件變量的條件成立”而掛起 
另一個線程使”條件成立”(給出條件成立信號)

條件變量典型使用步驟

申明和初始化需要同步的全局數據/變量(如count) 
申明和初始化一個條件變量對象 
申明和初始化對應的mutex 
創(chuàng)建若干進程并運行之

條件變量檢測

條件的檢測是在互斥鎖的保護下進行的 
如果條件為假,,一個線程自動阻塞 
如果另一個線程改變了條件,,它發(fā)信號給關聯的條件變量,喚醒一個或多個等待它的線程,,重新獲得互斥鎖,,重新評價條件

pthread_cond_init (condition,attr) 
pthread_cond_destroy(condition) 
pthread_condattr_init(attr) 
pthread_condattr_destroy(attr) 
  • 1
  • 2
  • 3
  • 4
  • 5

條件變量的初始化

聲明條件變量:pthread_cond_t 類型
使用前必須初始化,有兩種方法初始化方法
靜態(tài)方式
pthread_cond_t condition=PTHREAD_COND_INITIALIZER
動態(tài)方式
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
被創(chuàng)建的條件變量ID通過 參數返回給調用線程
該方法允許設置條件變量屬性
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

條件變量屬性

條件屬性僅僅定義一個屬性:process-shared 
允條件變量可以被其他進程中的線程訪問
如果使用此條件變量屬性,,必須把它定義為pthread_condattr_t 類型(缺省定義為NULL)
說明
并不是所有的實現都提供process-shared屬性
屬性操作函數
pthread_condattr_init():創(chuàng)建條件變量屬性對象 
pthread_condattr_destroy():銷毀條件變量屬性對象
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

函數原型 
int pthread_cond_destroy(pthread_cond_t *cond); 
銷毀所指定的條件變量,,同時將會釋放所給它分配的資源 
調用該函數的線程并不要求等待在參數所指定的條件變量上

條件變量的等待

函數原型
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); 
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t mytex, const struct timespec *abstime);
說明
阻塞調用線程,直到滿足特定的條件
當該線程運行時,,會被加鎖,,阻塞時會自動解鎖
當收到信號喚醒線程時,會被線程自動上鎖當線程完成更新共享數據后,,開發(fā)者有責任解鎖 
這里的互斥鎖必須是普通鎖或者適應鎖
調用前必須由本線程加鎖,,激活前要保持鎖是鎖定狀態(tài)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

條件變量的激活

函數原型
int pthread_cond_signal(pthread_cond_t *cond); 
int pthread_cond_broadcast(pthread_cond_t *cond);
說明
用于通知(喚醒)等待在條件變量上的另一線程
在被加鎖后被調用,在完成pthread_cond_wait()運行后必須解鎖 
二者區(qū)別
pthread_cond_signal()激活一個等待該條件的線程
pthread_cond_broadcast()激活所有等待的線程
如果多于一個線程處于阻塞狀態(tài),,應該用pthread_cond_broadcast()代替pthread_cond_signal()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

條件變量等待與激活使用說明

如果在調用pthread_cond_wait()前先調用pthread_cond_signal(),,將出現邏輯錯誤 
當使用上述函數時,必須正確的加鎖和解鎖
在調用pthread_cond_wait()之前沒有成功加鎖mutex會導致線程不會阻塞 
在調用 pthread_cond_signal()后沒有成功解鎖mutex,,會導致pthread_cond_wait()一直運行 (保持線程阻塞)
  • 1
  • 2
  • 3
  • 4
  • 5

條件變量示例

inc_count(): thread 0, count = 1, unlocking mutex
Starting watch_count(): thread 2
inc_count(): thread 1, count = 2, unlocking mutex
inc_count(): thread 0, count = 3, unlocking mutex
inc_count(): thread 1, count = 4, unlocking mutex
inc_count(): thread 0, count = 5, unlocking mutex
inc_count(): thread 0, count = 6, unlocking mutex
inc_count(): thread 1, count = 7, unlocking mutex
inc_count(): thread 0, count = 8, unlocking mutex
inc_count(): thread 1, count = 9, unlocking mutex
inc_count(): thread 0, count = 10, unlocking mutex
inc_count(): thread 1, count = 11, unlocking mutex
inc_count(): thread 0, count = 12  Threshold reached.
inc_count(): thread 0, count = 12, unlocking mutex
watch_count(): thread 2 Condition signal received.
inc_count(): thread 1, count = 13, unlocking mutex
inc_count(): thread 0, count = 14, unlocking mutex
inc_count(): thread 1, count = 15, unlocking mutex
inc_count(): thread 0, count = 16, unlocking mutex
inc_count(): thread 1, count = 17, unlocking mutex
inc_count(): thread 0, count = 18, unlocking mutex
inc_count(): thread 1, count = 19, unlocking mutex
inc_count(): thread 1, count = 20, unlocking mutex
Main(): Waited on 3  threads. Done.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

生產者/消費者問題

采用多線程技術解決生產者/消費者問題 
也稱有界緩沖區(qū)問題 
多個生產者線程向緩沖區(qū)中寫數據 
多個消費者線程從緩沖區(qū)中讀取數據 
生產者線程和消費者線程必須滿足 
生產者寫入緩沖區(qū)的數目不能超過緩沖區(qū)容量 
消費者讀取的數目不能超過生產者寫入的數目

緩沖區(qū)須被生產者/消費者進程互斥訪問
生產者進程
多個并發(fā)寫進程互斥改變寫指針
寫入條件:緩沖區(qū)非滿
消費者進程
多個并發(fā)讀進程互斥改變讀指針
讀取條件:緩沖區(qū)非空
讀/寫指針設計
初始化時,,讀指針和寫指針均為0
如果讀指針等于寫指針,則緩沖區(qū)為空
如果(寫指針+ 1) % BUFFER_SIZE等于讀指針,,則緩沖區(qū)為滿

緩沖區(qū)結構定義
一個mutex變量:pthread_mutex_t
lock
兩個條件變量: pthread_cond_t 
分別控制緩存空/滿狀態(tài)指示
notempty
notfull
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

生產者/消費者進程

1,、調用pthread_mutex_lock()對lock上鎖,并根據以下條件判斷緩沖區(qū)是否已滿,;
(writepos + 1) % BUFSIZE == readpos
2,、若滿,,調用phtread_cond_wait()進入阻塞,等待notfull條件變量,;
3,、寫入數據并移動寫指針writepos;
4,、調用pthread_cond_signal()向消費者信號通過notempty條件變量;
5,、調用pthread_mutex_unlock()對mutex解鎖。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
1,、調用pthread_mutex_lock()對lock上鎖,,并根據以下條件判斷緩沖區(qū)是否為空;
writepos == readpos
2,、若空,,調用ptread_cond_wait()進入阻塞,等待notempty條件變量,;
3,、讀取數據并移動讀指針readpos;
4,、調用pthread_cond_signal()向消費者信號通過notfull條件變量;
5,、調用pthread_mutex_unlock()對mutex解鎖。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

生產者/消費者問題—關鍵函數

線程管理相關函數
int pthread_create( );
int pthread_join();
線程互斥控制相關函數
int pthread_mutex_init();
int pthread_mutex_lock();
int pthread_mutex_unlock();
線程條件變量控制相關函數
int pthread_cond_init();
int pthread_cond_wait();
int pthread_cond_signal();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

理發(fā)師問題

問題描述 
一個理發(fā)店,,只有一個理發(fā)師,,只有n張可供顧客等待理發(fā)的椅子 
理發(fā)師 
如果沒有顧客,則理發(fā)師睡覺 
否則開始理發(fā) 
如果椅子為空,,則繼續(xù)睡覺 
顧客 
如果進入理發(fā)店發(fā)現理發(fā)師在睡覺,,則把他叫醒 
如果發(fā)現理發(fā)師在理發(fā),且有椅子為空,,則坐下來等待 
如果顧客發(fā)現椅子滿,,則離開

出自:http://blog.csdn.net/wangzi11322/article/details/45765923

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內容中的聯系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現有害或侵權內容,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多