臨界區和互斥鎖的區別

2021-07-25 12:55:12 字數 2333 閱讀 8413

1、臨界區只能用於物件在同一程序裡執行緒間的互斥訪問;互斥體可以用於物件程序間或執行緒間的互斥訪問。

2、臨界區是非核心物件,只在使用者態進行鎖操作,速度快;互斥體是核心物件,在核心態進行鎖操作,速度慢。

3、臨界區和互斥體在windows平台都下可用;linux下只有互斥體可用

互斥體物件用於程序間通訊:

multi_process_mutex.c

#include #include #include #include #include #include #define debug 1

#define share_key 0x1234

#define thread_num 4

typedef struct _share_stuff

share_stuff;

static share_stuff* stuff[thread_num];

void* threadb(void *prm);

int main(int argc,char** argv)

printf("shmid %d\n", shmid);

share_addr = (void*)shmat(shmid, (void*)0, 0);

if(share_addr < 0)

get the addr

#if debug

printf("share_addr:%x\n", (unsigned int)share_addr);

#endif

for(; i < thread_num; i++)

i = 0;

create_thread

pthread_condattr_t cond_attr;

pthread_condattr_init(&cond_attr);

pthread_condattr_setpshared(&cond_attr, pthread_process_shared);

pthread_mutexattr_t mutex_attr;

pthread_mutexattr_init(&mutex_attr);

pthread_mutexattr_setpshared(&mutex_attr, pthread_process_shared);

for(; i < thread_num; i++) }

pthread_condattr_destroy(&cond_attr);

pthread_mutexattr_destroy(&mutex_attr);

wait_for_done

for(i = 0; i < thread_num; i++)

#if debug

printf("all thread done!\n");

#endif

return 0;

}void* threadb(void *prm)

}

multi_process_mutex2.c

#include #include #include #include #include #include #define debug 1

#define share_key 0x1234

#define thread_num 4

typedef struct _share_stuff

share_stuff;

static share_stuff* stuff[thread_num];

void* threada(void *prm);

int main(int argc,char** argv)

printf("shmid %d\n", shmid);

share_addr = (void*)shmat(shmid,(void*)0,0);

if(share_addr < 0)

get the addr

#if debug

printf("share_addr:%x\n", (unsigned int)share_addr);

#endif

for(; i < thread_num; i++)

create_thread

for(i = 0; i < thread_num; i++) }

wait_for_done

for(i=0; i < thread_num; i++)

#if debug

printf("all thread done!\n");

#endif

return 0;

}void* threada(void *prm)

}

臨界區互斥

在考慮寫 之前應該先考慮我們要用什麼資料結構?以及該資料有什麼意義。p0 p1 在這裡,為了實現互斥使用了乙個共享變數turn。為什麼有效?在任意時刻turn的取值只能為0或1.因此條件while turn x 有且僅有乙個會被滿足,因而使得乙個程序得以訪問臨界區。至於turn被誰修改,什麼時候修改...

互斥鎖 臨界區 訊號量 事件的區別

引用位址 四種程序或執行緒同步互斥的控制方法 1 臨界區 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。2 互斥量 為協調共同對乙個共享資源的單獨訪問而設計的。3 訊號量 為控制乙個具有有限數量使用者資源而設計。4 事 件 用來通知執行緒有一些事件已發生,從而啟動後繼任務的開...

互斥鎖 臨界區 訊號量 事件的區別

四種程序或執行緒同步互斥的控制方法 1 臨界區 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。2 互斥量 為協調共同對乙個共享資源的單獨訪問而設計的。3 訊號量 為控制乙個具有有限數量使用者資源而設計。4 事 件 用來通知執行緒有一些事件已發生,從而啟動後繼任務的開始。臨界區...