青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-162  評論-223  文章-30  trackbacks-0
   信號量是一種用于并發環境同步手段的原語,分為無名信號量和有名信號量兩種,前者只能用于線程間同步,而后者還可用于進程間同步。它包括創建、等待、掛出、取值和銷毀5種基本操作。與互斥鎖不同的是:
   ● 信號量擁有一個計數值,表示可用的資源數量,僅當該值為0或1時,則相當于互斥鎖。
   ● 信號量是條件式加鎖,即僅當計數值不大于0時才會鎖住當前線程或進程,而互斥鎖則是無條件。
   ● 信號量的加鎖和解鎖不必是同一線程或進程,而互斥鎖則必須是同一個。
   ● 任何線程或進程都可以掛出一個信號,即使當前沒有線程或進程正在等待該信號值變成正數,而互斥鎖在沒有加鎖后解鎖則會發生錯誤。
   本文展示了基于Posix、PThread、SystemV和Win32四種平臺的封裝實現。

接口
   所有信號量操作,成功返回0,失敗返回-1,對應的錯誤碼,win32可調用getlasterror獲取,其它平臺則是errno。對于win32平臺的wait和trywait操作,廢棄返回1,超時返回2;因當前沒有獲取信號值的API,sema_getvalue操作簡單地返回-1。   
 1#ifdef _POSIX_SEM
 2#include <semaphore.h>
 3typedef struct 
 4{
 5    union 
 6    {
 7        sem_t* proc_sem_;
 8        sem_t thr_sem_;
 9    }
;
10    char* name_;
11}
 sema_t;
12
13typedef void SECURITY_ATTRIBUTES;
14
15#elif defined(_SYSV_SEM)
16typedef struct 
17{
18    int  id_;
19    char* name_;
20}
sema_t;
21
22typedef void SECURITY_ATTRIBUTES;
23
24#elif defined(_PTHREAD_SEM)
25#include <pthread.h>
26typedef struct 
27{
28    pthread_cond_t cond_;
29    pthread_mutex_t lock_;
30    int value_;
31}
sem_t;
32
33typedef struct
34{
35    union {
36        sem_t* proc_sem_;
37        sem_t thr_sem_;
38    }
;
39    char* name_;
40}
sema_t;
41
42typedef void SECURITY_ATTRIBUTES;
43
44#elif defined(_WIN32_SEM)
45#include <windows.h>
46typedef HANDLE sema_t;
47
48#else
49#error Currently only support posix,system v,pthread and win32 semaphore.
50#endif
51
52int sema_init(sema_t* s,const char* name,unsigned int value,unsigned int max,SECURITY_ATTRIBUTES* sa);
53
54int sema_wait(sema_t* s);
55
56int sema_trywait(sema_t* s);
57
58int sema_post(sema_t* s);
59
60int sema_getvalue(sema_t*s,int* val);
61
62int sema_destroy(sema_t* s);

實現
  1int sema_init(sema_t* s,const char* name,unsigned int value,unsigned int max,SECURITY_ATTRIBUTES* sa)
  2{
  3#ifdef _POSIX_SEM
  4    if(name){
  5        s->name_ = strdup(name);
  6        if(0==s->name_) 
  7            return -1;
  8        s->proc_sem_ = sem_open(name,O_CREAT,DEFAULT_FILE_PERMS,value);
  9        if(SEM_FAILED==s->proc_sem_) {
 10            free(s->name_);
 11            return -1;
 12        }

 13    }
else{
 14        if(-1==sem_init(&s->thr_sem_,0,value))
 15            return -1;
 16        s->name_ = 0;
 17    }

 18    return 0;
 19#elif defined(_SYSV_SEM)
 20    if(name){
 21        s->name_ = strdup(name);
 22        if(0==s->name_)
 23            return -1;
 24        if(-1==__sysv_sem_open(&s->id_,name,value)){
 25            free(s->name_);
 26            return -1;
 27        }

 28        return 0;
 29    }
else{
 30        if(-1==__sysv_init(&s->id_,value))
 31            return -1;
 32        s->name_ = 0;
 33    }

 34    return 0;
 35#elif defined(_PTHREAD_SEM)
 36    if(name){
 37        s->name_ = strdup(name);
 38        if(0==s->name_)
 39            return -1;
 40        s->proc_sem_ = __pthread_sem_open(name,value);
 41        if(0==s->proc_sem_){
 42            free(s->name_);
 43            return -1;
 44        }

 45    }
else{
 46        if(-1==__pthread_init(&s->thr_sem_,value))
 47            return -1;
 48        s->name_ = 0;
 49    }

 50    return 0;
 51#else
 52    return (*= CreateSemaphoreA(sa,value,max,name)) ? 0 : -1;
 53#endif
 54}

 55
 56int sema_wait(sema_t* s)
 57{
 58#ifdef _POSIX_SEM
 59    sem_t* sem = s->name_ ? s->proc_sem_ : &s->thr_sem_;
 60    return sem_wait(sem);
 61#elif defined(_SYSV_SEM)
 62    struct sembuf op;
 63    int ret;
 64    op.sem_num = 0;
 65    op.sem_op = -1;
 66    op.sem_flg = 0;
 67    return semop(s->id_, &op, 1);
 68#elif defined(_PTHREAD_SEM)
 69    sem_t* sem = s->name_ ? s->proc_sem_ : &s->thr_sem_;
 70
 71    int ret = pthread_mutex_lock(&sem->lock_);
 72    if(ret) {
 73        errno = ret; return -1;
 74    }

 75    while(0==sem->value_)
 76        pthread_cond_wait(&sem->cond_,&sem->lock_);
 77    --sem->value_;
 78    pthread_mutex_unlock(&sem->lock_);
 79
 80    return 0;
 81#else
 82    switch (WaitForSingleObject(*s, INFINITE))
 83    {
 84    case WAIT_OBJECT_0:  return 0;
 85    case WAIT_ABANDONED: return 1;
 86    defaultreturn -1;
 87    }

 88#endif
 89}

 90
 91int sema_trywait(sema_t* s)
 92{
 93#ifdef _POSIX_SEM
 94    sem_t* sem = s->name_ ? s->proc_sem_ : &s->thr_sem_;
 95    return sem_trywait(sem);
 96#elif defined(_SYSV_SEM)
 97    struct sembuf op;
 98    op.sem_num = 0;
 99    op.sem_op = -1;
100    op.sem_flg = IPC_NOWAIT;
101    return semop(s->id_, &op, 1);
102#elif defined(_PTHREAD_SEM)
103    sem_t* sem = s->name_ ? s->proc_sem_ : &s->thr_sem_;
104
105    int ret = pthread_mutex_lock(&sem->lock_);
106    if(ret) {
107        errno = ret; return -1;
108    }

109    if(0==sem->value_){
110        ret = -1; errno = EAGAIN;
111    }
else {
112        ret = 0--sem->value_;
113    }

114    pthread_mutex_unlock(&sem->lock_);
115    
116    return ret;
117#else
118    switch (WaitForSingleObject (*s, 0))
119    {
120    case WAIT_OBJECT_0:  return 0;
121    case WAIT_ABANDONED: return 1;
122    case WAIT_TIMEOUT:   return 2;
123    defaultreturn -1;
124    }

125#endif
126}

127
128int sema_post(sema_t* s)
129{
130#ifdef _POSIX_SEM
131    sem_t* sem = s->name_ ? s->proc_sem_ : &s->thr_sem_;
132    return sem_post(sem);
133#elif defined(_SYSV_SEM)
134    struct sembuf op;
135    op.sem_num = 0;
136    op.sem_op = 1;
137    op.sem_flg = 0;
138    return semop(s->id_, &op, 1);
139#elif defined(_PTHREAD_SEM)
140    sem_t* sem = s->name_ ? s->proc_sem_ : &s->thr_sem_;
141
142    pthread_mutex_lock(&sem->lock_);
143    if(0==sem->value_)
144        pthread_cond_signal(&sem->cond_);
145    ++sem->value_;
146    pthread_mutex_unlock(&sem->lock_);
147
148    return 0;
149#else
150    return ReleaseSemaphore(*s,1,0? 0 : -1;
151#endif
152}

153
154int sema_getvalue(sema_t* s,int* val)
155{
156#ifdef _POSIX_SEM
157    sem_t* sem = s->name_ ? s->proc_sem_ : &s->thr_sem_;
158    return sem_getvalue(sem,val);
159#elif defined(_SYSV_SEM)
160    int tmp = semctl(s->id_,0,GETVAL);
161    if(tmp < 0return -1;
162    *val = tmp;
163    return 0;
164#elif defined(_PTHREAD_SEM)
165    sem_t* sem = s->name_ ? s->proc_sem_ : &s->thr_sem_;
166    int ret = pthread_mutex_lock(&sem->lock_);
167    if(ret){
168        errno = ret; return -1;
169    }

170    *val = sem->value_;
171    pthread_mutex_unlock(&sem->lock_);
172#else
173    return -1;
174#endif
175}

176
177int sema_destroy(sema_t* s)
178{
179#ifdef _POSIX_SEM
180    if(s->name_){    
181        sem_unlink(s->name_);
182        free(s->name_);
183        if(-1==sem_close(s->proc_sem_))
184            return -1;
185    }
else{
186        if(-1==sem_destroy(&s->thr_sem_))
187            return -1;
188    }

189    return 0;
190#elif defined(_SYSV_SEM)
191    return semctl(s->id_,0,IPC_RMID);
192#elif defined(_PTHREAD_SEM)
193    if(s->name_) {
194        sem_t* sem = s->proc_sem_;
195
196        unlink(s->name_);
197        free(s->name_);
198        pthread_mutex_destroy(&sem->lock_);
199        pthread_cond_destroy(&sem->cond_);
200    
201        return munmap(sem,sizeof(sem_t));
202    }
else {
203        pthread_mutex_destroy(&s->thr_sem_.lock_);
204        pthread_cond_destroy(&s->thr_sem_.cond_);
205    }

206    return 0;
207#else
208    return CloseHandle(*s) ? 0 : -1;
209#endif
210}
posted on 2012-07-20 10:52 春秋十二月 閱讀(2202) 評論(0)  編輯 收藏 引用 所屬分類: C/C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品综合网站| 欧美一区1区三区3区公司| 久久亚洲风情| 小嫩嫩精品导航| 国内综合精品午夜久久资源| 欧美一区二区精品| 欧美主播一区二区三区| 亚洲二区在线视频| 999在线观看精品免费不卡网站| 欧美激情影音先锋| 亚洲视频每日更新| 亚洲性线免费观看视频成熟| 国产一区二区三区免费不卡| 欧美mv日韩mv国产网站| 欧美区在线播放| 欧美一区1区三区3区公司| 久久精品亚洲一区| av成人黄色| 欧美一区二区三区日韩视频| 亚洲日本中文字幕免费在线不卡| 免费的成人av| 欧美一二三视频| 亚洲国产欧美一区二区三区久久 | 999在线观看精品免费不卡网站| 欧美三级免费| 欧美~级网站不卡| 欧美日韩国产综合一区二区| 久久精品日韩| 欧美全黄视频| 免费不卡在线视频| 国产精品久久久久国产精品日日| 久久精品在线| 欧美另类videos死尸| 久久精品国产精品亚洲| 欧美国产欧美亚洲国产日韩mv天天看完整 | 狠狠色丁香久久婷婷综合丁香| 91久久久久久久久| 在线日韩欧美视频| 久久久久久穴| 国产精品久久波多野结衣| 免费成人毛片| 国产精品爽爽爽| 亚洲三级影院| 亚洲大片在线| 欧美专区日韩视频| 欧美一区二区三区四区视频 | 亚洲在线中文字幕| 一本色道久久综合亚洲精品不卡| 欧美影院视频| 久久成人亚洲| 欧美午夜精品伦理| 亚洲人成高清| 亚洲精品久久久久久久久久久久久| 午夜精品久久久久久久| 亚洲欧美激情精品一区二区| 欧美高清视频免费观看| 欧美韩国日本一区| 亚洲高清激情| 老司机一区二区| 免费成人在线观看视频| 精品1区2区3区4区| 欧美专区在线| 久久躁狠狠躁夜夜爽| 国内精品久久久久久久97牛牛| 亚洲永久在线| 欧美在线一二三四区| 国产午夜精品久久久久久免费视| 国产精品a久久久久| 午夜宅男久久久| 国产精品一卡| 午夜精品久久久久久99热软件| 欧美在线日韩在线| 国产在线欧美日韩| 久久国产福利| 亚洲砖区区免费| 先锋影音国产精品| 国产农村妇女毛片精品久久莱园子| 亚洲午夜久久久久久久久电影网| 9l视频自拍蝌蚪9l视频成人| 欧美视频第二页| 亚洲一区二区视频在线| 香蕉成人久久| 黄色成人在线网址| 美女诱惑一区| 日韩视频不卡| 久久国产精品免费一区| 伊人春色精品| 欧美日韩国产二区| 亚洲欧美一区二区精品久久久| 久久精品国产久精国产一老狼 | 国产精品久久久久久久久久久久久久| 亚洲婷婷在线| 久久影院亚洲| 99亚洲一区二区| 国产精品亚洲精品| 美女日韩欧美| 亚洲午夜伦理| 欧美激情久久久| 亚洲欧美视频在线观看视频| 好看不卡的中文字幕| 欧美全黄视频| 欧美一区二区三区在| 亚洲国产成人高清精品| 亚洲视频图片小说| 在线欧美电影| 国产精品欧美日韩| 欧美国产精品久久| 香蕉久久一区二区不卡无毒影院 | 一本色道久久| 激情综合久久| 国产精品视频免费在线观看| 免费一级欧美在线大片| 亚洲欧美日韩视频一区| 亚洲国产精品ⅴa在线观看| 午夜欧美不卡精品aaaaa| 亚洲激情网址| 国产一区日韩欧美| 国产精品乱子乱xxxx| 欧美成人中文字幕| 久久激情综合| 午夜欧美精品久久久久久久| 亚洲人成人77777线观看| 免费不卡视频| 久久夜色精品国产欧美乱| 午夜欧美不卡精品aaaaa| 亚洲无线视频| 日韩亚洲一区在线播放| 亚洲第一天堂av| 黄色成人在线观看| 国产在线高清精品| 国产日韩精品入口| 国产精品麻豆va在线播放| 欧美大片第1页| 男人插女人欧美| 裸体歌舞表演一区二区| 久久久久久久久久久久久女国产乱| 午夜精品福利视频| 亚洲欧美在线高清| 亚洲欧美日韩人成在线播放| 亚洲一区在线观看免费观看电影高清| 亚洲精品四区| 日韩视频欧美视频| 99热精品在线观看| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲黄页视频免费观看| 亚洲国产高清视频| 欧美电影免费| 蜜桃伊人久久| 欧美成人精品一区二区三区| 牛人盗摄一区二区三区视频| 免费欧美网站| 免费人成精品欧美精品| 免费成人高清视频| 欧美精品福利在线| 欧美特黄一区| 国产精品一区一区| 国产一区二区三区在线观看精品| 韩国av一区二区三区| 136国产福利精品导航| 亚洲福利视频三区| 一级成人国产| 欧美一级日韩一级| 猛男gaygay欧美视频| 亚洲电影免费在线| aa亚洲婷婷| 久久激情视频免费观看| 欧美 亚欧 日韩视频在线| 欧美欧美在线| 国产精品午夜久久| 1000精品久久久久久久久 | 欧美视频日韩视频| 国产一区亚洲| 亚洲日产国产精品| 久久精品1区| 亚洲激情偷拍| 亚洲欧美国产一区二区三区| 久久影院午夜片一区| 欧美人牲a欧美精品| 国产亚洲免费的视频看| 91久久精品国产91久久| 香蕉视频成人在线观看| 欧美国产在线电影| 亚洲专区免费| 欧美激情视频给我| 国产性猛交xxxx免费看久久| 亚洲精品久久久久中文字幕欢迎你 | 欧美高清视频一区二区| 亚洲视频第一页| 毛片精品免费在线观看| 国产精品视频一| 亚洲欧洲在线一区| 久久久激情视频| 99国产麻豆精品| 美女在线一区二区| 国产伦精品一区二区三区视频孕妇 | 国产乱子伦一区二区三区国色天香| 亚洲电影第1页| 欧美资源在线观看| 亚洲欧洲偷拍精品| 久久久精品国产免费观看同学|