亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? linux(1).txt

?? 本人搜集的Linux學習文檔
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
它會返回相應的信息,程序員可以針對死鎖做出相應的處理。另外不同的互斥鎖類型對死鎖的處理不一樣
,但最主要的還是要程序員自己在程序設計注意這一點。

  3、條件變量

  前一節中我們講述了如何使用互斥鎖來實現線程間數據的共享和通信,互斥鎖一個明顯的缺點是它只
有兩種狀態:鎖定和非鎖定。而條件變量通過允許線程阻塞和等待另一個線程發送信號的方法彌補了互斥
鎖的不足,它常和互斥鎖一起使用。使用時,條件變量被用來阻塞一個線程,當條件不滿足時,
線程往往解開相應的互斥鎖并等待條件發生變化。一旦其它的某個線程改變了條件變量,它將通知相應的
條件變量喚醒一個或多個正被此條件變量阻塞的線程。這些線程將重新鎖定互斥鎖并重新測試條件是否滿
足。一般說來,條件變量被用來進行線承間的同步。 

  條件變量的結構為pthread_cond_t,函數pthread_cond_init()被用來初始化一個條件變量。
它的原型為:
extern int pthread_cond_init __P ((pthread_cond_t *__cond,__const pthread_condattr_t *__cond_attr));

  其中cond是一個指向結構pthread_cond_t的指針,cond_attr是一個指向結構pthread_condattr_t的指針。結構pthread_condattr_t是條件變量的屬性結構,和互斥鎖一樣我們可以用它來設置條件變量是進程內可用還是進程間可用,默認值是PTHREAD_ PROCESS_PRIVATE,即此條件變量被同一進程內的各個線程使用。注意初始化條件變量只有未被使用時才能重新初始化或被釋放。釋放一個條件變量的函數為pthread_cond_ destroy(pthread_cond_t cond)。 

  函數pthread_cond_wait()使線程阻塞在一個條件變量上。它的函數原型為:

  extern int pthread_cond_wait __P ((pthread_cond_t *__cond,pthread_mutex_t *__mutex));

  線程解開mutex指向的鎖并被條件變量cond阻塞。線程可以被函數pthread_cond_signal和函數pthread_cond_broadcast喚醒,但是要注意的是,條件變量只是起阻塞和喚醒線程的作用,具體的判斷條件還需用戶給出,例如一個變量是否為0等等,這一點我們從后面的例子中可以看到。線程被喚醒后,它將重新檢查判斷條件是否滿足,如果還不滿足,一般說來線程應該仍阻塞在這里,被等待被下一次喚醒。這個過程一般用while語句實現。

  另一個用來阻塞線程的函數是pthread_cond_timedwait(),它的原型為:
  extern int pthread_cond_timedwait __P ((pthread_cond_t *__cond,pthread_mutex_t *__mutex, __const struct timespec *__abstime));

  它比函數pthread_cond_wait()多了一個時間參數,經歷abstime段時間后,即使條件變量不滿足,阻塞也被解除。

  函數pthread_cond_signal()的原型為:

  extern int pthread_cond_signal __P ((pthread_cond_t *__cond));

  它用來釋放被阻塞在條件變量cond上的一個線程。多個線程阻塞在此條件變量上時,哪一個線程被喚醒是由線程的調度策略所決定的。要注意的是,必須用保護條件變量的互斥鎖來保護這個函數,否則條件滿足信號又可能在測試條件和調用pthread_cond_wait函數之間被發出,從而造成無限制的等待。下面是使用函數pthread_cond_wait()和函數pthread_cond_signal()的一個簡單的例子。

pthread_mutex_t count_lock;
pthread_cond_t count_nonzero;
unsigned count;
decrement_count () {
 pthread_mutex_lock (&count_lock);
 while(count==0) 
  pthread_cond_wait( &count_nonzero, &count_lock);
  count=count -1;
 pthread_mutex_unlock (&count_lock);
}

increment_count(){
 pthread_mutex_lock(&count_lock);
 if(count==0)
  pthread_cond_signal(&count_nonzero);
  count=count+1;
 pthread_mutex_unlock(&count_lock);
} 

  count值為0時,decrement函數在pthread_cond_wait處被阻塞,并打開互斥鎖count_lock。此時,當調用到函數increment_count時,pthread_cond_signal()函數改變條件變量,告知decrement_count()停止阻塞。讀者可以試著讓兩個線程分別運行這兩個函數,看看會出現什么樣的結果。

  函數pthread_cond_broadcast(pthread_cond_t *cond)用來喚醒所有被阻塞在條件變量cond上的線程。這些線程被喚醒后將再次競爭相應的互斥鎖,所以必須小心使用這個函數。

  4、信號量

  信號量本質上是一個非負的整數計數器,它被用來控制對公共資源的訪問。當公共資源增加時,調用函數sem_post()增加信號量。只有當信號量值大于0時,才能使用公共資源,使用后,函數sem_wait()減少信號量。函數sem_trywait()和函數pthread_ mutex_trylock()起同樣的作用,它是函數sem_wait()的非阻塞版本。下面我們逐個介紹和信號量有關的一些函數,它們都在頭文件/usr/include/semaphore.h中定義。

  信號量的數據類型為結構sem_t,它本質上是一個長整型的數。函數sem_init()用來初始化一個信號量。它的原型為:

  extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));

  sem為指向信號量結構的一個指針;pshared不為0時此信號量在進程間共享,否則只能為當前進程的所有線程共享;value給出了信號量的初始值。

  函數sem_post( sem_t *sem )用來增加信號量的值。當有線程阻塞在這個信號量上時,調用這個函數會使其中的一個線程不在阻塞,選擇機制同樣是由線程的調度策略決定的。

  函數sem_wait( sem_t *sem )被用來阻塞當前線程直到信號量sem的值大于0,解除阻塞后將sem的值減一,表明公共資源經使用后減少。函數sem_trywait ( sem_t *sem )是函數sem_wait()的非阻塞版本,它直接將信號量sem的值減一。

  函數sem_destroy(sem_t *sem)用來釋放信號量sem。

  下面我們來看一個使用信號量的例子。在這個例子中,一共有4個線程,其中兩個線程負責從文件讀取數據到公共的緩沖區,另兩個線程從緩沖區讀取數據作不同的處理(加和乘運算)。

/* File sem.c */
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define MAXSTACK 100
int stack[MAXSTACK][2];
int size=0;
sem_t sem;
/* 從文件1.dat讀取數據,每讀一次,信號量加一*/
void ReadData1(void){
 FILE *fp=fopen("1.dat","r");
 while(!feof(fp)){
  fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]);
  sem_post(&sem);
  ++size;
 }
 fclose(fp);
}
/*從文件2.dat讀取數據*/
void ReadData2(void){
 FILE *fp=fopen("2.dat","r");
 while(!feof(fp)){
  fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]);
  sem_post(&sem);
  ++size;
 }
 fclose(fp);
}
/*阻塞等待緩沖區有數據,讀取數據后,釋放空間,繼續等待*/
void HandleData1(void){
 while(1){
  sem_wait(&sem);
  printf("Plus:%d+%d=%dn",stack[size][0],stack[size][1],
  stack[size][0]+stack[size][1]);
  --size;
 }
}

void HandleData2(void){
 while(1){
  sem_wait(&sem);
  printf("Multiply:%d*%d=%dn",stack[size][0],stack[size][1],
  stack[size][0]*stack[size][1]);
  --size;
 }
}
int main(void){
 pthread_t t1,t2,t3,t4;
 sem_init(&sem,0,0);
 pthread_create(&t1,NULL,(void *)HandleData1,NULL);
 pthread_create(&t2,NULL,(void *)HandleData2,NULL);
 pthread_create(&t3,NULL,(void *)ReadData1,NULL);
 pthread_create(&t4,NULL,(void *)ReadData2,NULL);
 /* 防止程序過早退出,讓它在此無限期等待*/
 pthread_join(t1,NULL);
} 

  在Linux下,我們用命令gcc -lpthread sem.c -o sem生成可執行文件sem。 我們事先編輯好數據文件1.dat和2.dat,假設它們的內容分別為1 2 3 4 5 6 7 8 9 10和 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 ,我們運行sem,得到如下的結果:

Multiply:-1*-2=2
Plus:-1+-2=-3
Multiply:9*10=90
Plus:-9+-10=-19
Multiply:-7*-8=56
Plus:-5+-6=-11
Multiply:-3*-4=12
Plus:9+10=19
Plus:7+8=15
Plus:5+6=11

  從中我們可以看出各個線程間的競爭關系。而數值并未按我們原先的順序顯示出來這是由于size這個數值被各個線程任意修改的緣故。這也往往是多線程編程要注意的問題。

  小結

  多線程編程是一個很有意思也很有用的技術,使用多線程技術的網絡螞蟻是目前最常用的下載工具之一,使用多線程技術的grep比單線程的grep要快上幾倍,類似的例子還有很多。希望大家能用多線程技術寫出高效實用的好程序來。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜臀91精品一区二区三区| 中文字幕第一区| 欧美午夜一区二区| 99视频一区二区| 成人精品一区二区三区中文字幕| 精品一区二区三区在线观看 | 夜夜嗨av一区二区三区四季av| 国产女同性恋一区二区| 国产亚洲1区2区3区| 久久久久久夜精品精品免费| 国产午夜亚洲精品理论片色戒| 26uuu久久综合| 久久久久久日产精品| 亚洲国产精华液网站w| 中文字幕日本乱码精品影院| 亚洲欧美在线高清| 亚洲v日本v欧美v久久精品| 免费成人性网站| 久久国产视频网| 成人黄色777网| 色94色欧美sute亚洲线路二| 欧美日韩的一区二区| 欧美成人精品3d动漫h| 中文字幕不卡三区| 亚洲综合av网| 国产伦精品一区二区三区免费迷 | 亚洲影院在线观看| 蜜臀久久99精品久久久久宅男| 黄色小说综合网站| 99久久99久久精品国产片果冻| 欧美人体做爰大胆视频| 亚洲精品在线观看网站| 亚洲婷婷综合久久一本伊一区| 亚洲狠狠爱一区二区三区| 国产一区二区h| 欧美影院一区二区| 久久精品夜色噜噜亚洲a∨| 亚洲欧美日韩国产手机在线| 久久精品国产一区二区三| 91在线观看高清| 欧美成人a在线| 亚洲国产日韩一区二区| 成人禁用看黄a在线| 欧美一区二区三区在| 精品影院一区二区久久久| 色综合一区二区| 2021中文字幕一区亚洲| 亚洲国产视频在线| 91在线国产福利| 久久精品一区二区三区不卡| 午夜精品一区二区三区三上悠亚| 成人v精品蜜桃久久一区| 日韩三级电影网址| 一区二区三区中文字幕精品精品 | 国产一区二区在线观看视频| 一本久道中文字幕精品亚洲嫩| 精品国产网站在线观看| 亚洲一区二区三区四区在线| 不卡在线视频中文字幕| 久久久久久久久伊人| 男男成人高潮片免费网站| 在线国产电影不卡| 国产精品久久久久久久裸模| 国产一区二区在线影院| 91精品国产一区二区三区香蕉| 亚洲精品你懂的| 99精品视频一区二区| 国产精品午夜在线观看| 国产成人综合亚洲91猫咪| 日韩欧美中文字幕公布| 亚洲va国产va欧美va观看| 91福利在线观看| 一区2区3区在线看| 欧洲一区在线电影| 亚洲精品乱码久久久久| 欧美性猛交xxxx乱大交退制版| 亚洲男人的天堂在线观看| fc2成人免费人成在线观看播放| 国产欧美精品一区二区色综合朱莉 | 99久久精品国产观看| 最新久久zyz资源站| 99免费精品在线观看| 国产精品国产三级国产| 色综合久久综合网97色综合| 亚洲欧美一区二区三区国产精品| hitomi一区二区三区精品| 国产精品电影一区二区三区| 91麻豆国产福利在线观看| 亚洲免费在线播放| 欧美日韩国产天堂| 精品一区二区在线播放| 国产精品色婷婷久久58| 一本色道久久综合亚洲aⅴ蜜桃 | 欧美三级视频在线播放| 石原莉奈一区二区三区在线观看| 91精品国产免费| 国产在线一区二区| 中文字幕一区免费在线观看| 欧美主播一区二区三区美女| 青青草原综合久久大伊人精品 | 国产精品不卡在线观看| 91久久国产最好的精华液| 日韩中文字幕麻豆| 337p粉嫩大胆色噜噜噜噜亚洲| 国产成人免费高清| 亚洲一本大道在线| 精品少妇一区二区| 97精品视频在线观看自产线路二| 亚洲一区在线观看免费观看电影高清 | 国产精品毛片高清在线完整版 | 26uuu另类欧美亚洲曰本| av在线播放一区二区三区| 亚洲国产精品天堂| 国产亲近乱来精品视频| 欧美群妇大交群中文字幕| 国产传媒日韩欧美成人| 五月天久久比比资源色| 中文字幕精品一区二区精品绿巨人 | 国产亚洲美州欧州综合国| 色婷婷亚洲综合| 国产精品一卡二卡| 婷婷久久综合九色综合伊人色| 日本一区二区三级电影在线观看 | 欧美午夜在线观看| 成人午夜视频免费看| 蜜桃久久久久久| 亚洲精品高清在线| 中文字幕av一区二区三区免费看| 欧美日韩成人一区| 日本大香伊一区二区三区| 国产成a人无v码亚洲福利| 蜜桃精品视频在线| 亚洲成av人片在线观看无码| 国产精品国产三级国产| 国产日韩欧美一区二区三区综合| 日韩欧美激情在线| 欧美美女黄视频| 在线观看网站黄不卡| av一区二区三区黑人| 国产白丝精品91爽爽久久| 久久99国产精品尤物| 青青草视频一区| 婷婷丁香久久五月婷婷| 亚洲午夜在线电影| 亚洲女女做受ⅹxx高潮| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 日本久久一区二区| av综合在线播放| 91在线观看地址| 91影院在线免费观看| www.在线成人| 成人avav影音| 91免费视频观看| 色综合久久88色综合天天免费| 99久久久无码国产精品| 成人黄色软件下载| 色综合天天综合网天天看片| 99精品欧美一区| 91色乱码一区二区三区| 日本道在线观看一区二区| 欧洲亚洲国产日韩| 欧美日韩成人在线| 日韩美女在线视频| 久久久久久97三级| 国产精品久久久久久久久免费桃花| 国产婷婷一区二区| 中文字幕亚洲一区二区va在线| 亚洲欧洲av色图| 丝袜美腿亚洲色图| 国产在线国偷精品产拍免费yy| 久久99精品国产| 99在线热播精品免费| 欧美日韩一级片在线观看| 日韩欧美电影一区| 中文一区二区在线观看| 亚洲综合色噜噜狠狠| 奇米色一区二区三区四区| 久国产精品韩国三级视频| 国产超碰在线一区| 在线一区二区三区| 精品免费国产一区二区三区四区| 国产日韩欧美亚洲| 丝袜美腿一区二区三区| 88在线观看91蜜桃国自产| 日韩一区二区三区四区| 亚洲国产精品av| 日韩有码一区二区三区| 粉嫩嫩av羞羞动漫久久久| 欧美自拍偷拍午夜视频| 精品国产一区二区亚洲人成毛片| 国产精品久久久久久久岛一牛影视 | 2020国产精品自拍| 亚洲精品国久久99热| 激情六月婷婷久久| 91久久线看在观草草青青| 日韩精品一区二区三区四区 | 欧美日韩小视频| 亚洲国产经典视频| 日本少妇一区二区| 在线亚洲欧美专区二区|