線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1169
推到 Plurk!
推到 Facebook!

在Linux中,實現類似windows系列的mutex

 
rexchiu
中階會員


發表:14
回覆:88
積分:70
註冊:2002-03-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-19 18:41:13 IP:220.130.xxx.xxx 未訂閱
在Linux中,實現類似windows系列的mutex,以確保同一時間只有一份程式在執行! 我用semaphore來實作的,因為自己專案中有這樣的需求.可是不知道這樣的做法 好不好. semun.h
#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)
/* union semun is defined by including  */
#else
/* according to X/OPEN we have to define it ourselves */
union semun
{
        int val;                  /* value for SETVAL */
        struct semid_ds *buf;     /* buffer for IPC_STAT, IPC_SET */
        unsigned short *array;    /* array for GETALL, SETALL */
        /* Linux specific part: */
        struct seminfo *__buf;    /* buffer for IPC_INFO */
};
#endif 
sema.c
#include 
#include 
#include     #include 
#include 
#include     #include "semun.h"    static int get_semvalue(void);
static int set_semvalue(int v);    static int sem_id;    int main(int argc,char *argv[])
{
        char buf[1024];
        int ret;
        
        sem_id=semget((key_t)1234,1,0666|IPC_CREAT);
        printf("sem id is %d\n",sem_id);
        ret=get_semvalue();
        printf("get value %d\n",ret);            if ((ret!=-1)&&(ret==0))
        {
                ret=set_semvalue(1);
                printf("set value %d\n",ret);
                printf("get value %d\n",get_semvalue());
        }
        else if(ret==1)
        {
                printf("Another program is running\n");
                exit(0);
        }
        printf("Input end to finish\n");
        while(strncmp("end",buf,3)!=0)
        {
                fgets(buf,1024,stdin);
        }
        set_semvalue(0);
}    static int get_semvalue(void)
{
        union semun sem_union;
        int k;
        if((k=semctl(sem_id,0,GETVAL,sem_union))==-1) return -1;
        return k;
}    static int set_semvalue(int v)
{
        union semun sem_union;            sem_union.val=v;
        if(semctl(sem_id,0,SETVAL,sem_union)==-1) return -1;
        return 0;
}
Best Regards, Rex Chiu
------
Best Regards,
Rex Chiu
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-25 01:27:46 IP:211.76.xxx.xxx 未訂閱
rexchiu 兄您好: 感謝您無私的貢獻,補充一些資訊 : Mutex 其實就是 sem resource 個數 = 1 .. 另一個可以保護 Global 資源,達到同步化目的方法為 spin lock .. 兩者使用上還是有些差異, sem 會使 waiting 的 porcess 或 thread 進入排程器排程, spin lock 則進入 busy loop .. 視不同等待資源時間的長短與頻率,選擇兩個之一的鎖定方法,可以提升程式效率,尤其在 Kernel Mode (Ex : Device Driver 中)更是明顯... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
系統時間:2024-07-03 5:48:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!