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

隨筆-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>
            免费视频亚洲| 亚洲欧美在线免费观看| 久久精品国产欧美亚洲人人爽| 欧美日本韩国| 国产一区二区三区四区hd| 一区二区亚洲精品| 一区二区三区视频免费在线观看| 欧美在线www| 亚洲国产一区二区在线| 亚洲一二三区精品| 久久视频一区二区| 亚洲午夜小视频| 欧美精品一区在线| 亚洲免费影视第一页| 亚洲激情一区| 欧美va天堂在线| 一区二区三区在线免费观看| 欧美成人在线免费视频| 欧美淫片网站| 国产精品青草久久久久福利99| 亚洲人成网站精品片在线观看| 久久久一区二区| 亚洲欧美精品中文字幕在线| 欧美调教vk| aa日韩免费精品视频一| 亚洲第一区中文99精品| 久久国产精品久久精品国产 | 欧美一区二区三区精品| 欧美淫片网站| 亚洲一区二区三区四区在线观看| 久久精彩视频| 亚洲制服丝袜在线| 在线综合+亚洲+欧美中文字幕| 欧美日本亚洲视频| 久久久99爱| 久久精品国产69国产精品亚洲| 亚洲免费av片| 一区二区三区日韩在线观看| 欧美日韩亚洲不卡| 亚洲欧美三级伦理| 欧美777四色影视在线| 欧美在线|欧美| 欧美午夜精品久久久久久超碰| 亚洲综合国产精品| 欧美大片91| 亚洲天堂av在线免费| 亚洲一区二区三区777| 国产日产亚洲精品| 欧美xxx成人| 欧美日韩午夜精品| 亚洲电影天堂av| 一区二区在线观看av| 亚洲欧美日韩国产| 在线欧美不卡| 日韩网站免费观看| 国产亚洲精品资源在线26u| 日韩午夜激情| 99在线|亚洲一区二区| 欧美高清视频一区二区三区在线观看| 亚洲免费网站| 国产精品久久久久一区二区三区共| 久久免费精品日本久久中文字幕| 国产精品久久久久影院色老大| 美女精品国产| 亚洲欧美国产另类| 欧美亚洲日本国产| 先锋资源久久| 亚洲黄色在线视频| 一区二区av| 中文日韩电影网站| 欧美四级电影网站| 中日韩在线视频| 亚洲一区中文字幕在线观看| 国产精品99免视看9| 一区二区日本视频| 欧美亚洲在线播放| 国产婷婷精品| 夜夜爽99久久国产综合精品女不卡| 国产一区日韩一区| 亚洲深夜福利网站| 欧美一区二区三区男人的天堂| 国产日韩欧美视频| 久久久国产成人精品| 午夜精品视频在线| 国产亚洲福利| 美日韩免费视频| 久热精品视频在线| 国产精品乱码妇女bbbb| 午夜免费电影一区在线观看| 久久久99爱| 亚洲裸体视频| 国产乱码精品一区二区三| 亚洲精选久久| 一区二区久久久久| 国产精品一区一区| 蜜臀av一级做a爰片久久| 一本久道久久综合婷婷鲸鱼| 欧美一区二区三区喷汁尤物| 亚洲大黄网站| 国产精品美女久久久| 久久频这里精品99香蕉| 巨乳诱惑日韩免费av| 日韩午夜在线视频| 欧美精品一区二区三区视频| 亚洲自拍偷拍网址| 亚洲国产欧美日韩| 香蕉av777xxx色综合一区| 亚洲国产精品久久久久婷婷老年| 久久一区视频| 亚洲性感美女99在线| 亚洲第一成人在线| 久久精品视频一| 亚洲一二三四久久| 亚洲黄色av| 国产视频精品网| 欧美午夜精品| 欧美麻豆久久久久久中文| 欧美一区二区成人| 美女主播精品视频一二三四| 亚洲综合激情| 亚洲视频综合| 亚洲精品一区在线观看| 国际精品欧美精品| 国产精品日韩| 国产精品mv在线观看| 欧美另类综合| 欧美88av| 裸体素人女欧美日韩| 久久精品国产综合| 欧美一级午夜免费电影| 亚洲午夜精品久久久久久浪潮| 亚洲国产天堂久久综合| 欧美成人中文字幕| 蜜桃av综合| 欧美成年人视频网站欧美| 久久尤物电影视频在线观看| 久久免费视频网站| 欧美成人精品不卡视频在线观看 | 国产精品日本欧美一区二区三区| 欧美另类videos死尸| 欧美国产日韩xxxxx| 浪潮色综合久久天堂| 亚洲全黄一级网站| 亚洲免费婷婷| 午夜欧美精品久久久久久久| 亚洲综合日本| 欧美亚洲视频一区二区| 午夜精品在线| 久久久国际精品| 久久综合婷婷| 欧美激情亚洲另类| 欧美一区二区三区免费在线看| 午夜免费久久久久| 久久精品夜色噜噜亚洲a∨| 久久久久9999亚洲精品| 久久先锋资源| 欧美激情一区| 日韩亚洲不卡在线| 亚洲尤物影院| 久久久www成人免费精品| 欧美v国产在线一区二区三区| 蜜臀av在线播放一区二区三区| 欧美大片免费观看| 国产精品国产馆在线真实露脸| 免费欧美在线视频| 欧美日韩1区2区| 蜜臀av性久久久久蜜臀aⅴ| 欧美国产亚洲另类动漫| 国产精品扒开腿爽爽爽视频 | 欧美日韩一区视频| 国产精品久久久久久久久久免费| 国产欧美精品| 亚洲精品国产精品久久清纯直播 | 99精品视频一区| 欧美亚洲视频一区二区| 免费成人av在线看| 99这里只有久久精品视频| 欧美亚洲免费电影| 欧美大尺度在线观看| 国产欧美大片| 亚洲精品视频一区| 久久成人资源| 久久激情一区| 亚洲日本成人网| 性欧美video另类hd性玩具| 欧美刺激午夜性久久久久久久| 国产欧美亚洲视频| 99精品国产福利在线观看免费| 久久国产精品色婷婷| 亚洲精品乱码久久久久久按摩观| 亚洲欧美综合一区| 欧美久久久久中文字幕| 狠狠色综合网| 亚洲欧洲三级电影| 久久福利影视| 中文日韩电影网站| 欧美高清在线观看| 精品av久久久久电影| 午夜精品视频在线| 一本色道久久|