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

隨筆-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>
            伊人婷婷欧美激情| 久久亚裔精品欧美| 久久久国产视频91| 欧美在线日韩精品| 久久久水蜜桃| 欧美激情2020午夜免费观看| 免费在线观看成人av| 亚洲国产精品欧美一二99| 欧美fxxxxxx另类| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美高清在线播放| 夜夜嗨av一区二区三区网站四季av | 久久久久成人网| 久久全球大尺度高清视频| 免费成人黄色av| 欧美视频免费| 激情亚洲网站| 久久久无码精品亚洲日韩按摩| 亚洲欧美视频在线观看视频| 久久精品人人做人人爽电影蜜月| 久久久精品tv| 亚洲欧美日韩中文在线制服| 免费久久99精品国产自| 欧美三级在线视频| 亚洲精品日韩一| 久久视频这里只有精品| 亚洲欧美日韩爽爽影院| 欧美色图首页| 一本一本久久| 日韩一级免费| 国产精品爽爽爽| 性8sex亚洲区入口| 亚洲日本欧美| 欧美人与性禽动交情品| 99re在线精品| 99精品视频免费全部在线| 欧美精品激情| 亚洲综合精品四区| 午夜日韩福利| 伊人久久亚洲热| 亚洲高清免费视频| 国产精品二区二区三区| 亚洲欧美在线一区二区| 欧美一区二区网站| 91久久国产精品91久久性色| 亚洲国产成人久久综合| 欧美日韩小视频| 久久久久久91香蕉国产| 欧美v日韩v国产v| 欧美一区午夜精品| 欧美激情视频网站| 欧美成人精品一区二区三区| 日韩一级精品视频在线观看| 亚洲男人影院| 夜夜狂射影院欧美极品| 久久精品国产清高在天天线| 中文一区二区| 久久在线免费观看| 羞羞答答国产精品www一本| 欧美精品国产精品| 狼人天天伊人久久| 国产一区二区三区高清播放| 亚洲片在线观看| 日韩一级视频免费观看在线| 久久国产福利| 久久久精品国产免费观看同学| 欧美日韩人人澡狠狠躁视频| 久久影院亚洲| **性色生活片久久毛片| 西瓜成人精品人成网站| 久久国产免费| 韩国精品一区二区三区| 欧美专区在线播放| 久久一区视频| 亚洲国产视频一区二区| 亚洲精品日韩激情在线电影 | 在线成人欧美| 老巨人导航500精品| 欧美高清在线播放| 亚洲影院免费| 精品999成人| 欧美日韩理论| 欧美一区深夜视频| 亚洲激情视频网站| 欧美在线观看日本一区| 在线播放视频一区| 欧美日韩中文字幕在线视频| 亚洲网址在线| 狠狠色丁香婷综合久久| 久久在线视频| 欧美一区二区日韩| 亚洲靠逼com| 欧美成人国产va精品日本一级| 日韩午夜激情| 在线日韩av片| 亚洲电影毛片| 国产日韩欧美在线观看| 欧美成人网在线| 欧美一区二区日韩一区二区| 日韩一级二级三级| 亚洲青涩在线| 亚洲精品日韩在线观看| 欧美成人免费视频| 久久精品视频免费| 午夜精品福利电影| 亚洲一区免费| 亚洲欧美在线aaa| 先锋影音国产一区| 亚洲在线国产日韩欧美| 午夜精彩视频在线观看不卡 | 欧美色欧美亚洲高清在线视频| 久久精品系列| 久久免费99精品久久久久久| 亚洲免费视频观看| 久久久99精品免费观看不卡| 午夜一区二区三区不卡视频| 一区二区三区欧美日韩| 亚洲欧美国产一区二区三区| 亚洲女人天堂av| 久久综合色播五月| 欧美激情视频一区二区三区不卡| 欧美高清视频一区| 国产精品欧美一区喷水| 国产亚洲精品综合一区91| 亚洲国产毛片完整版 | 最新亚洲视频| 日韩午夜av| 老鸭窝亚洲一区二区三区| 麻豆视频一区二区| 欧美午夜电影一区| 在线观看国产欧美| 亚洲——在线| 亚洲啪啪91| 久久视频国产精品免费视频在线| 欧美国产一区视频在线观看| 国产日韩欧美黄色| 亚洲一区二区三区四区五区黄| 久久成人久久爱| 亚洲天堂免费在线观看视频| 麻豆成人在线播放| 亚洲国产成人91精品| 午夜亚洲精品| 亚洲视频在线观看视频| 欧美精品日韩精品| 日韩视频一区二区| 亚洲精品中文字幕在线| 蜜臀久久久99精品久久久久久 | 欧美日本网站| 亚洲乱码视频| 一本色道久久综合亚洲精品不 | 欧美激情麻豆| 亚洲乱码国产乱码精品精天堂| 欧美福利视频在线| 久热精品在线视频| 日韩视频免费| 亚洲精品一区在线观看| 欧美日韩成人精品| 先锋影音国产一区| 久久精选视频| 亚洲黄色小视频| 亚洲制服欧美中文字幕中文字幕| 国产精品国产三级欧美二区| 销魂美女一区二区三区视频在线| 午夜在线电影亚洲一区| 久久成年人视频| 亚洲第一页在线| 亚洲免费观看高清在线观看| 国产精品久久久久久久久久免费| 小处雏高清一区二区三区| 久久久久99| 亚洲在线免费| 欧美日韩国产精品一区| 久久精品欧美日韩精品| 欧美国产在线观看| 欧美大片一区二区三区| 国产精品女主播| 亚洲精品麻豆| 99re国产精品| 免费欧美在线视频| 久久综合久久久| 国产婷婷成人久久av免费高清 | 久久国产欧美精品| 亚洲综合日韩中文字幕v在线| 久久久久久香蕉网| 麻豆精品在线观看| 国产视频欧美| 久久精品国产久精国产爱| 欧美一区二区三区日韩| 欧美私人网站| 在线视频亚洲欧美| 亚洲一区二区三区视频播放| 欧美日韩mp4| 亚洲综合欧美日韩| 久久久青草婷婷精品综合日韩 | 亚洲一区亚洲二区| 国产精品成人观看视频国产奇米| 亚洲乱码精品一二三四区日韩在线| 亚洲高清免费视频| 欧美午夜精品久久久久久孕妇| 在线视频日韩|