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

隨筆-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>
            久久久久久久久综合| 中文在线资源观看网站视频免费不卡 | 小处雏高清一区二区三区| 一本色道久久综合亚洲精品按摩| 亚洲国产成人在线播放| 欧美福利一区二区| 亚洲高清色综合| 99热免费精品| 亚洲综合激情| 久久久噜噜噜久久久| 模特精品裸拍一区| 国产精品白丝av嫩草影院| 国产精品亚洲综合色区韩国| 国产视频一区二区在线观看| 在线播放亚洲一区| 99视频在线观看一区三区| 亚洲一区在线免费| 久久国内精品自在自线400部| 欧美成人r级一区二区三区| 亚洲日韩欧美视频一区| 欧美一区二区三区喷汁尤物| 免费不卡在线观看| 国产精品美女久久久久久久| 国产一区二区三区在线观看免费视频 | 久久久久一区| 亚洲国产欧美一区二区三区久久 | 国产精品国色综合久久| 欧美国产视频一区二区| 亚洲精品欧美激情| 欧美一区二区免费| 欧美国产三区| 国产日韩在线一区二区三区| 91久久精品国产91久久性色tv| 99国产精品一区| 久久蜜桃资源一区二区老牛 | 女女同性精品视频| 国产乱码精品一区二区三区忘忧草 | 久久综合九色综合欧美就去吻| 欧美日本精品一区二区三区| 狠狠噜噜久久| 亚洲一区网站| 亚洲国产影院| 久久九九99视频| 国产精品夜夜夜| 一区二区三区视频在线看| 久久亚洲综合色| 亚洲女人av| 国产毛片一区| 欧美在线观看视频一区二区三区| 在线亚洲观看| 国产精品久久久91| 午夜精品久久久99热福利| aaa亚洲精品一二三区| 欧美日韩一区二区三区在线看 | 欧美激情欧美狂野欧美精品| 欧美专区一区二区三区| 国产欧美一区二区三区久久| 欧美一级黄色网| 亚洲欧美日韩国产精品| 国产乱码精品一区二区三区不卡| 亚欧成人在线| 久久精品亚洲国产奇米99| 亚洲无限av看| 国产精品免费一区二区三区在线观看| 亚洲午夜影视影院在线观看| 日韩视频一区| 国产精品v亚洲精品v日韩精品| 亚洲一级特黄| 亚洲伊人伊色伊影伊综合网| 欧美亚一区二区| 一区二区三区欧美激情| 日韩天天综合| 欧美好骚综合网| 亚洲视频一区在线观看| 亚洲国产精品va在线看黑人| 久久久青草青青国产亚洲免观| 久久久综合激的五月天| 亚洲啪啪91| 蜜桃伊人久久| 久久网站热最新地址| 在线观看视频一区| 免费在线观看成人av| 久久久精品999| 很黄很黄激情成人| 91久久中文字幕| 欧美人与禽性xxxxx杂性| 亚洲精品久久久久| 亚洲国产欧美一区二区三区丁香婷| 久久夜色精品| 亚洲日本成人| 亚洲欧洲美洲综合色网| 欧美日韩免费看| 一本大道久久a久久综合婷婷| 亚洲国产精品电影在线观看| 欧美成人国产| 亚洲视频在线看| 午夜视频久久久久久| 国产综合久久久久久鬼色| 亚洲视频成人| 亚洲欧美在线高清| 影视先锋久久| 欧美激情一区二区三区成人| 欧美va亚洲va国产综合| 亚洲一区3d动漫同人无遮挡| 亚洲一区二区三区四区中文| 国产一级揄自揄精品视频| 亚洲影院色无极综合| 久久久蜜桃精品| 一区二区日韩| 性欧美精品高清| 亚洲精品国产视频| 亚洲一区综合| 精品成人一区二区| 亚洲国产一区二区三区在线播 | 亚洲综合欧美日韩| 欧美一区二区三区在线| 国产女主播一区二区三区| 亚洲欧美色一区| 久久精品一区四区| 99re热这里只有精品免费视频| 亚洲欧美日韩直播| 亚洲精品国产精品乱码不99 | 亚洲一区欧美一区| 久久成人综合视频| 在线性视频日韩欧美| 欧美一区二区视频免费观看| 狠狠88综合久久久久综合网| 亚洲欧美另类在线| 亚洲精品久久久久久久久| 亚洲女同同性videoxma| 亚洲精品免费电影| 欧美在线一级视频| 亚洲午夜av在线| 嫩草成人www欧美| 亚洲精品一区二区三区婷婷月| 亚洲一区综合| 亚洲自拍偷拍视频| 欧美韩日一区二区| 毛片精品免费在线观看| 国产精品欧美在线| 亚洲理伦在线| 国产亚洲欧美另类中文| 欧美在线免费视屏| 性欧美18~19sex高清播放| 欧美片网站免费| 欧美夫妇交换俱乐部在线观看| 国产女主播在线一区二区| 99视频精品| 一区二区三区产品免费精品久久75 | 在线精品观看| 欧美一级视频一区二区| 亚洲欧美日韩综合aⅴ视频| 欧美日产一区二区三区在线观看| 久久一区中文字幕| 欧美一区二区视频观看视频| 久色成人在线| 黑人一区二区三区四区五区| 午夜欧美精品| 久久婷婷色综合| 国模精品一区二区三区| 亚洲欧美怡红院| 久久精品国产77777蜜臀| 亚洲第一综合天堂另类专| 久久精品一本| 欧美电影免费观看高清| 亚洲国产日韩欧美在线99| 免费不卡在线观看av| 91久久在线播放| 韩国av一区二区| 欧美日韩在线第一页| 99在线观看免费视频精品观看| 一本色道久久综合亚洲精品婷婷| 欧美精品久久久久久久免费观看 | 欧美福利影院| 一本到高清视频免费精品| 欧美日韩午夜精品| 一区二区精品| 久久久99精品免费观看不卡| 黄色亚洲大片免费在线观看| 免费高清在线视频一区·| 欧美成人一区二区| 性色av一区二区三区红粉影视| 国产精品任我爽爆在线播放 | 久久久国产视频91| 香蕉国产精品偷在线观看不卡| 在线观看欧美日韩国产| 欧美国产综合视频| 夜夜爽99久久国产综合精品女不卡| 亚洲一区在线免费观看| 国产综合久久久久久鬼色| 欧美成人第一页| 亚洲电影毛片| 久久久综合激的五月天| 亚洲精品欧美| 国产精品久久国产三级国电话系列 | 亚洲欧美一区二区精品久久久| 国产欧美日韩视频在线观看| 久久久久久久波多野高潮日日| 亚洲精品一二三区| 久久久国产精彩视频美女艺术照福利 |