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

隨筆-163  評(píng)論-223  文章-30  trackbacks-0
   互斥鎖,用來(lái)保證任一時(shí)刻只有單個(gè)線程或進(jìn)程擁有對(duì)共享資源的互斥訪問(wèn)權(quán),在這里將posix thread中的互斥體、win32中的互斥體和臨界區(qū),統(tǒng)稱(chēng)為互斥鎖,其特點(diǎn)如下:
   ● 范圍線程鎖進(jìn)程鎖,前者僅用于同一進(jìn)程內(nèi)多線程間,而后者用于進(jìn)程間,顯然,它也能用于同一進(jìn)程內(nèi)多線程間,但效率較低。posix的互斥體既可以是線程鎖,也可以是進(jìn)程鎖,這由它的一個(gè)屬性決定:pthread_process_shared或pthread_process_private。win32中的臨界區(qū)是一種線程鎖,而互斥體既可以是線程鎖,也可以是進(jìn)程鎖,這由它的一個(gè)名稱(chēng)決定:createmutex中的第3個(gè)參數(shù)。
   ● 類(lèi)型:posix中的互斥體,包括普通鎖遞歸鎖檢測(cè)鎖適應(yīng)鎖四種;而win32中的臨界區(qū)在同一線程內(nèi)可多次加鎖和解鎖,相當(dāng)于遞歸鎖,而互斥體則相當(dāng)于普通鎖。
   ● 操作:包括創(chuàng)建鎖、加鎖、解鎖、檢測(cè)鎖和銷(xiāo)毀鎖5種操作,其中加鎖操作又可分為永久等待超時(shí)等待2種。對(duì)于win32中的臨界區(qū),不存在超時(shí)等待的加鎖。

接口
   所有鎖操作,成功返回0,失敗posix返回非0的錯(cuò)誤碼,win32返回-1,調(diào)用getlasterror可獲取錯(cuò)誤碼。對(duì)于超時(shí)加鎖,第2個(gè)參數(shù)超時(shí)不是時(shí)間差,而是絕對(duì)到期時(shí)間。對(duì)于win32中的互斥體,廢棄返回1,超時(shí)返回2。
 1#ifdef _POSIX_THREAD
 2#include <pthread.h>
 3#include <sys/time.h>
 4
 5typedef pthread_mutex_t mutex_t;
 6typedef pthread_mutexattr_t mutexattr_t;
 7typedef void SECURITY_ATTRIBUTES;
 8
 9#elif defined(_WIN32_THREAD)
10#ifndef _WIN32_WINNT
11# define _WIN32_WINNT 0x0501
12#endif
13#include <winsock2.h>
14
15typedef struct  
16{
17    int type_;
18    union
19    {
20        HANDLE proc_lock_;
21        CRITICAL_SECTION thr_lock_;
22    }
;
23}
mutex_t;
24typedef void mutexattr_t;
25
26#else
27#error Currently only support win32 and posix thread models
28#endif
29
30#define MUTEX_THREAD_SHARED  1
31#define MUTEX_PROCESS_SHARED 2
32
33int mutex_init(mutex_t* m,int scope,int type,const char* name,
34               mutexattr_t* attr,SECURITY_ATTRIBUTES* sa);
35
36int mutex_lock(mutex_t* m);
37
38int mutex_timedlock(mutex_t* m,const struct timeval* val);
39
40int mutex_trylock(mutex_t* m);
41
42int mutex_unlock(mutex_t* m);
43
44int mutex_destroy(mutex_t* m);

實(shí)現(xiàn) 
  1int mutex_init(mutex_t* m,int scope,int type,const char* name,mutexattr_t* attr,SECURITY_ATTRIBUTES* sa)
  2{
  3#ifdef _POSIX_THREAD
  4    int ret, init = 0;
  5    pthread_mutexattr_t tmp;
  6    if(0==attr) attr = &tmp;
  7    if(attr==&tmp)
  8    {
  9        ret = pthread_mutexattr_init(attr);
 10        if (0==ret) init = 1;
 11    }

 12    if(0==ret && 0 != scope)
 13    {
 14#ifdef  _POSIX_THREAD_PROCESS_SHARED
 15        ret = pthread_mutexattr_setpshared(attr,lock_scope);
 16#endif
 17    }

 18    if(0==ret && 0 != type)
 19    {
 20#ifdef __USE_UNIX98
 21        ret = pthread_mutexattr_settype(attr,lock_type);
 22#endif
 23    }

 24    if (0==ret)
 25        ret = pthread_mutex_init(m,attr);
 26    if (1==init && attr==&tmp)
 27        pthread_mutexattr_destroy(attr);
 28    return ret;
 29#else
 30    m->type_ = scope;
 31    switch (m->type_)
 32    {
 33    case MUTEX_THREAD_SHARED:
 34        __try
 35        {
 36            InitializeCriticalSection(&m->thr_lock_);
 37        }

 38        __except(EXCEPTION_EXECUTE_HANDLER)
 39        {
 40            return -1;
 41        }

 42        return 0;
 43
 44    case MUTEX_PROCESS_SHARED:
 45        m->proc_lock_ = CreateMutexA(sa,FALSE,name);
 46        if (0==m->proc_lock_&&ERROR_ACCESS_DENIED==GetLastError())
 47            m->proc_lock_ = OpenMutexA(MUTEX_ALL_ACCESS,FALSE,name);
 48        if (0==m->proc_lock_)
 49            return -1;        
 50        return 0;
 51
 52    defaultreturn -1;
 53    }

 54#endif
 55}

 56
 57int mutex_lock(mutex_t* m)
 58{
 59#ifdef _POSIX_THREAD
 60    return pthread_mutex_lock(m);
 61#else
 62    switch(m->type_)
 63    {
 64    case MUTEX_THREAD_SHARED:
 65        EnterCriticalSection(&m->thr_lock_);
 66        return 0;
 67    
 68    case MUTEX_PROCESS_SHARED:
 69        switch (WaitForSingleObject (m->proc_lock_, INFINITE))
 70        {
 71        case WAIT_OBJECT_0:  return 0;
 72        case WAIT_ABANDONED: return 1;
 73        defaultreturn -1;
 74        }

 75        break;
 76
 77    defaultreturn -1
 78    }

 79#endif
 80}

 81
 82int mutex_timedlock(mutex_t* m,const struct timeval* val)
 83{
 84    //val should be an absolute time.
 85#ifdef _POSIX_THREAD
 86    struct timespec ts = {.tv_sec = val->tv_sec,.tv_nsec=val->tv_usec*1000};
 87    return pthread_mutex_timedlock(m,&ts);
 88#else
 89    switch(m->type_)
 90    {
 91    // not support CriticalSection,so simply return -1.
 92    case MUTEX_THREAD_SHARED:
 93        return -1
 94
 95    case MUTEX_PROCESS_SHARED:
 96        {
 97            FILETIME ft;
 98            struct timeval cur,diff;
 99        
100            GetSystemTimeAsFileTime(&ft);
101            cur = FileTime2TimeVal(&ft);
102            diff = timeval_sub(val,&cur);
103
104            switch (WaitForSingleObject (m->proc_lock_, timeval_millsec(&diff)))
105            {
106            case WAIT_OBJECT_0:  return 0;
107            case WAIT_ABANDONED: return 1;
108            case WAIT_TIMEOUT:      return 2;
109            defaultreturn -1;
110            }

111        }

112        break;
113
114    defaultreturn -1;
115    }

116#endif
117}

118
119int mutex_trylock(mutex_t* m)
120{
121#ifdef _POSIX_THREAD
122    return pthread_mutex_trylock(m);
123#else
124    switch(m->type_)
125    {
126    case MUTEX_THREAD_SHARED:
127        if (!TryEnterCriticalSection(&m->thr_lock_))
128            return -1;
129        return 0;
130        
131    case MUTEX_PROCESS_SHARED:
132        switch (WaitForSingleObject (m->proc_lock_, 0))
133        {
134        case WAIT_OBJECT_0:  return 0;
135        case WAIT_ABANDONED: return 1;
136        case WAIT_TIMEOUT:   return 2;
137        defaultreturn -1;
138        }

139        break;
140
141    defaultreturn -1;
142    }

143#endif
144}

145
146int mutex_unlock(mutex_t* m)
147{
148#ifdef _POSIX_THREAD
149    return pthread_mutex_unlock(m);
150#else
151    switch(m->type_)
152    {
153    case MUTEX_THREAD_SHARED:
154        LeaveCriticalSection(&m->thr_lock_);
155        return 0;
156
157    case MUTEX_PROCESS_SHARED:
158        if (!ReleaseMutex(m->proc_lock_))
159            return -1;
160        return 0;
161
162    defaultreturn -1;
163    }

164#endif
165}

166
167int mutex_destroy(mutex_t* m)
168{
169#ifdef _POSIX_THREAD
170    return pthread_mutex_destroy(m);
171#else
172    switch(m->type_)
173    {
174    case MUTEX_THREAD_SHARED:
175        DeleteCriticalSection(&m->thr_lock_);
176        return 0;
177
178    case MUTEX_PROCESS_SHARED:
179        if (!CloseHandle(m->proc_lock_))
180            return -1;
181        return 0;
182
183    defaultreturn -1;
184    }

185#endif
186}

posted on 2012-06-23 00:08 春秋十二月 閱讀(3611) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): C/C++

評(píng)論:
# re: 一種簡(jiǎn)單的跨平臺(tái)互斥鎖 2012-06-24 12:19 | 易寶@byhh
這樣搞可以用來(lái)學(xué)習(xí),用的時(shí)候有點(diǎn)沒(méi)必要。

之前有過(guò)一個(gè)關(guān)于宏的探討。 若有十個(gè)函數(shù)都要用到跨平臺(tái)的宏。是用

#ifdef ABCD

fun1

fun2 .....
fun10

#else


#endif 好一些。

還是用

fun1
{
#ifdef

#else

#endif
}

fun2...

fun10

好一些。

從你的代碼上來(lái)看。 用第一種反而好一些。定義了某個(gè)平臺(tái)后,另一個(gè)平臺(tái)的代碼直接不用看了。  回復(fù)  更多評(píng)論
  
# re: 一種簡(jiǎn)單的跨平臺(tái)互斥鎖 2012-07-13 16:04 | erran
@易寶@byhh

嚴(yán)重同意,

不然視同亂碼。。。。。。。。。。。。
  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产日韩欧美麻豆| 久久综合伊人77777麻豆| 亚洲大黄网站| 午夜精品福利一区二区蜜股av| 免费在线日韩av| 国产一区二区高清视频| 亚洲主播在线| 亚洲精品一二三| 欧美成人一品| 在线看片成人| 久久躁狠狠躁夜夜爽| 亚洲欧美第一页| 国产精品户外野外| 在线亚洲一区二区| 亚洲经典在线| 欧美91大片| 亚洲国产精品热久久| 久久亚洲国产成人| 欧美一区二区私人影院日本| 国产精品视频一区二区三区| 亚洲——在线| aa成人免费视频| 欧美日韩午夜| 中文av一区特黄| 99re这里只有精品6| 欧美日本免费一区二区三区| 亚洲精品美女久久7777777| 牛牛国产精品| 免费亚洲一区| 亚洲人成网站影音先锋播放| 亚洲高清av| 欧美成人一区二区| 亚洲精品国产品国语在线app | 久久久999精品| 国产亚洲女人久久久久毛片| 久久精品一级爱片| 欧美在线观看一区| 极品av少妇一区二区| 六月婷婷久久| 蜜臀91精品一区二区三区| 亚洲福利视频三区| 欧美激情五月| 欧美激情影院| 中文在线资源观看网站视频免费不卡 | 久久视频一区| 另类激情亚洲| 日韩视频精品| 正在播放亚洲| 国产午夜精品美女视频明星a级 | 中文av字幕一区| 国产精品婷婷| 久久视频在线视频| 麻豆久久久9性大片| 亚洲精品中文字| 一本到高清视频免费精品| 国产精品亚洲一区| 久久亚洲视频| 欧美成人免费观看| 亚洲午夜视频在线| 亚洲欧美日韩另类| 在线观看国产成人av片| 亚洲激情午夜| 国产精品青草久久| 美女久久网站| 欧美日韩国产成人在线观看| 亚洲欧美日韩区| 久久精品欧美日韩精品| 亚洲人成毛片在线播放| 日韩一二三区视频| 国产一区成人| 亚洲经典三级| 国产麻豆精品theporn| 麻豆精品91| 欧美日韩麻豆| 久久久久久夜| 欧美精品乱人伦久久久久久| 性久久久久久| 麻豆国产精品777777在线| 在线视频你懂得一区二区三区| 午夜精品视频在线| 亚洲人成毛片在线播放女女| 亚洲亚洲精品三区日韩精品在线视频| 狠狠综合久久av一区二区小说 | 在线日韩视频| 一区二区日韩伦理片| 韩国av一区二区三区在线观看 | 国内偷自视频区视频综合| 亚洲国产午夜| 国产日韩一区二区三区| 亚洲国产成人av在线| 国产日韩欧美亚洲| 亚洲经典在线| 激情久久五月| 国产精品99久久不卡二区| 亚洲第一在线综合在线| 亚洲色图自拍| 亚洲精品国产精品国产自| 午夜精品美女自拍福到在线| 亚洲精品综合久久中文字幕| 午夜精品福利视频| 一区二区三区视频在线播放| 久久久久国产一区二区三区四区| 亚洲一二三四久久| 免费观看久久久4p| 久久久久久一区| 欧美无乱码久久久免费午夜一区| 欧美freesex8一10精品| 国产精品影片在线观看| 亚洲精品国精品久久99热| 在线观看亚洲精品视频| 亚洲欧美激情诱惑| 在线视频欧美日韩精品| 免费不卡亚洲欧美| 久久久亚洲高清| 国产精品一区二区三区久久| 亚洲精品久久久久久久久| 亚洲高清毛片| 久久本道综合色狠狠五月| 亚洲欧美日韩国产一区| 欧美日韩精品一二三区| 欧美激情一区在线| 精品av久久707| 亚洲欧美日韩在线| 亚洲在线视频网站| 欧美日韩成人在线| 亚洲国产精品电影| 亚洲国产精品国自产拍av秋霞| 久久成人免费网| 久久精品二区三区| 国产精品视频xxxx| 中文欧美在线视频| 亚洲一区二区三区视频| 欧美日韩国产小视频| 亚洲丰满在线| 亚洲人成网站在线播| 麻豆精品在线视频| 欧美高清在线视频观看不卡| 狠狠综合久久| 久久久久久久久久久久久久一区 | 午夜亚洲影视| 亚洲一区二区四区| 欧美日韩国产不卡| 亚洲激情一区| 亚洲美女中文字幕| 欧美激情一区二区在线| 亚洲国产精品悠悠久久琪琪| 亚洲黄色视屏| 欧美www视频| 亚洲高清视频中文字幕| 亚洲欧洲一区| 欧美jizz19性欧美| 亚洲国产精品成人精品| 亚洲精品一区在线| 欧美区一区二| 日韩午夜剧场| 亚洲影院污污.| 国产精品久久久久秋霞鲁丝| 亚洲一区二区三区四区五区黄| 先锋影音国产一区| 国产欧美精品一区| 久久国产一区二区三区| 麻豆精品网站| 91久久精品国产91久久| 欧美激情一区二区三区在线视频观看 | 国产精品专区第二| 先锋影音一区二区三区| 久久先锋影音av| 亚洲高清不卡在线| 欧美久久久久久久久久| 亚洲精品在线电影| 亚洲一区免费看| 国产欧美韩国高清| 久久久久久电影| 免费不卡在线观看| 亚洲九九爱视频| 欧美性大战久久久久久久| 亚洲欧美日韩成人高清在线一区| 久久久www成人免费精品| 亚洲国产成人精品视频| 欧美精品一区二区蜜臀亚洲 | 免费欧美在线| 日韩视频永久免费观看| 欧美三区在线观看| 欧美亚洲网站| 欧美mv日韩mv亚洲| 一区二区三区鲁丝不卡| 国产乱码精品一区二区三区av| 欧美中文字幕久久| 亚洲国产日韩一区| 亚洲欧美日韩视频一区| 韩国av一区二区| 欧美激情一区在线| 亚洲欧洲av一区二区三区久久| 老司机久久99久久精品播放免费| 91久久精品一区二区三区| 欧美体内she精视频在线观看| 欧美一区激情| 亚洲精品一区二| 久久精品女人天堂| 日韩天堂在线观看|