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

隨筆-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区| 欧美一区在线看| 99这里有精品| 99精品视频免费在线观看| 久久黄色级2电影| 欧美99久久| 亚洲欧洲在线视频| 欧美77777| 亚洲破处大片| 99精品久久久| 国产欧美日韩91| 久久久精品网| 99热免费精品在线观看| 午夜精品视频一区| 狠狠色狠狠色综合日日小说| 久久综合久久久久88| 亚洲黄色毛片| 欧美伊人久久久久久午夜久久久久 | 免费成人av| 夜夜爽www精品| 国产精品蜜臀在线观看| 欧美一区二区网站| 亚洲精品国精品久久99热| 欧美一区二区成人| 亚洲精品字幕| 狠狠色综合色区| 欧美人与性禽动交情品| 欧美在线不卡| 日韩午夜电影av| 美女图片一区二区| 亚洲欧美精品在线观看| 亚洲国产欧美在线| 国产午夜亚洲精品不卡| 欧美日韩国产一区精品一区| 久久精品五月婷婷| 一区二区三区视频在线观看| 欧美高清影院| 玖玖玖国产精品| 香蕉成人伊视频在线观看| 亚洲日本成人| 一色屋精品视频免费看| 国产精品国产三级国产专区53 | 欧美尤物一区| 亚洲精品一区二区在线| 美女网站久久| 久久精品女人| 欧美一区二区三区在| 一区二区三区成人| 亚洲欧洲综合| 亚洲激情影院| 亚洲激情在线视频| 在线观看亚洲视频| 韩国在线视频一区| 国产偷自视频区视频一区二区| 国产精品二区三区四区| 欧美日本亚洲视频| 欧美激情成人在线| 欧美激情视频免费观看| 久热综合在线亚洲精品| 午夜精品在线观看| 夜夜嗨av一区二区三区网站四季av| 欧美国产在线电影| 蘑菇福利视频一区播放| 久久综合中文字幕| 免费在线国产精品| 欧美高清hd18日本| 欧美黄色大片网站| 亚洲人成亚洲人成在线观看| 亚洲精品裸体| 亚洲一区免费观看| 欧美一区二区在线播放| 久久xxxx| 免费看亚洲片| 欧美日韩视频专区在线播放 | 亚洲精品美女91| 亚洲精品麻豆| 一区二区三区四区五区在线| 午夜精品亚洲一区二区三区嫩草| 亚洲欧美国产制服动漫| 亚洲一区二区在线| 亚洲欧美区自拍先锋| 亚洲国产女人aaa毛片在线| 亚洲激情综合| 一区二区三区毛片| 中文国产一区| 亚洲午夜激情| 欧美一区二区三区免费观看视频| 久久久蜜桃一区二区人| 亚洲欧美中文另类| 欧美成年人视频网站欧美| 蜜臀av在线播放一区二区三区| 欧美超级免费视 在线| 欧美大片在线看免费观看| 欧美+亚洲+精品+三区| 亚洲国产精品福利| 亚洲最黄网站| 亚洲一区二区三| 亚洲夜晚福利在线观看| 亚洲欧美国产高清| 欧美一区二区免费观在线| 性色一区二区| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美三级视频在线| 欧美日韩精品高清| 国产日韩精品一区二区浪潮av| 精久久久久久| 亚洲免费视频网站| 久久久99精品免费观看不卡| 亚洲精品日韩欧美| 亚洲激情欧美| 欧美一进一出视频| 欧美国产日韩在线| 国内精品久久久久久| 亚洲精品精选| 午夜一级久久| 91久久国产综合久久蜜月精品| 亚洲一区三区在线观看| 99这里只有久久精品视频| 久久综合色婷婷| 国产欧美视频一区二区三区| 一区二区三区精密机械公司| 欧美大片18| 香蕉精品999视频一区二区| 欧美成人黑人xx视频免费观看| 国产精品香蕉在线观看| 国产一区二区三区在线观看免费| 亚洲成人原创| 亚洲色在线视频| 久热精品视频在线观看| 亚洲欧美国产精品桃花| 欧美ed2k| 国产日韩欧美精品综合| 一区二区欧美激情| 欧美成人综合| 亚洲自拍偷拍福利| 国产精品久久国产精品99gif| 亚洲大黄网站| 欧美电影在线免费观看网站| 久久九九国产| 一区在线视频| 免费成人在线观看视频| 久久久蜜桃一区二区人| 亚洲成人在线视频播放| 麻豆精品91| 久久久久一本一区二区青青蜜月| 国产一区观看| 亚洲图色在线| 亚洲性人人天天夜夜摸| 欧美精品一区二区在线播放| 久久国产精品久久精品国产| 在线一区二区三区四区五区| 欧美成人在线免费视频| 亚洲另类自拍| 一区二区三区四区五区精品| 欧美日韩亚洲高清| 亚洲综合大片69999| 亚洲手机成人高清视频| 国产欧美一区二区三区沐欲 | 99视频在线观看一区三区| 国产精品久久91| 久久综合色一综合色88| 欧美激情综合在线| 亚洲视频在线观看三级| 亚洲欧美激情四射在线日 | 亚洲美女黄色片| 一区二区三区视频在线播放| 国产日韩欧美综合一区| 欧美3dxxxxhd| 国产精品成人一区二区| 欧美呦呦网站| 欧美国内亚洲| 欧美一级理论片| 麻豆精品在线播放| 亚洲一区国产一区| 免费观看欧美在线视频的网站| 一区二区高清| 久久婷婷丁香| 午夜视频在线观看一区| 免费观看亚洲视频大全| 亚洲欧美激情一区| 欧美va日韩va| 久久全球大尺度高清视频| 欧美理论视频| 女人天堂亚洲aⅴ在线观看| 欧美日韩在线另类| 欧美成人午夜77777| 国产精品午夜电影| 亚洲精品资源美女情侣酒店| 在线观看日韩欧美| 午夜视频一区在线观看| 一本久久a久久精品亚洲| 久久久99国产精品免费| 亚洲无限乱码一二三四麻| 久久亚洲精品一区二区| 欧美一区二区国产| 欧美午夜精品电影| 欧美激情亚洲视频| 曰本成人黄色| 欧美在线日韩精品| 久久久www|