• <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>
            隨筆-161  評(píng)論-223  文章-30  trackbacks-0
               互斥鎖,用來(lái)保證任一時(shí)刻只有單個(gè)線程或進(jìn)程擁有對(duì)共享資源的互斥訪問(wèn)權(quán),在這里將posix thread中的互斥體、win32中的互斥體和臨界區(qū),統(tǒ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è)名稱決定:createmutex中的第3個(gè)參數(shù)。
               ● 類型:posix中的互斥體,包括普通鎖遞歸鎖檢測(cè)鎖適應(yīng)鎖四種;而win32中的臨界區(qū)在同一線程內(nèi)可多次加鎖和解鎖,相當(dāng)于遞歸鎖,而互斥體則相當(dāng)于普通鎖。
               ● 操作:包括創(chuàng)建鎖、加鎖、解鎖、檢測(cè)鎖和銷毀鎖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 春秋十二月 閱讀(3586) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 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)論
              
            久久国产色AV免费看| 久久无码AV中文出轨人妻| aaa级精品久久久国产片| 久久精品一区二区| 欧美日韩成人精品久久久免费看| 午夜精品久久久内射近拍高清| 亚洲国产精品久久久天堂| 久久精品国产精品亚洲| 亚洲AV无码久久| 人人狠狠综合88综合久久| 2020久久精品国产免费| 亚洲精品成人久久久| 久久精品国产91久久麻豆自制| 青青青青久久精品国产h久久精品五福影院1421 | 色婷婷噜噜久久国产精品12p| 一本色综合网久久| 无码任你躁久久久久久久| 免费精品99久久国产综合精品| 伊人久久精品无码二区麻豆| 精品久久人人做人人爽综合| 2021少妇久久久久久久久久| 久久天天躁狠狠躁夜夜不卡| 欧美日韩中文字幕久久久不卡 | 久久成人精品| 九九99精品久久久久久| 欧美精品久久久久久久自慰| 免费精品久久天干天干| 亚洲精品tv久久久久久久久久| 精品久久久久国产免费| 99久久婷婷国产一区二区| 狠狠久久亚洲欧美专区| 国产亚洲美女精品久久久久狼| av午夜福利一片免费看久久| 亚洲精品乱码久久久久久中文字幕| 欧美一区二区久久精品| 久久午夜福利无码1000合集| 2020国产成人久久精品| 久久久久av无码免费网| 无遮挡粉嫩小泬久久久久久久| 亚洲国产精品无码久久一区二区 | 久久精品国产福利国产琪琪|