執行緒的同步 互斥機制

2021-12-29 21:40:03 字數 3077 閱讀 6900

整理執行緒同步的api函式及其作用

執行緒同步的方式和機制

臨界區、互斥量、事件、訊號量四種方式

臨界區(critical section)、互斥量(mutex)、訊號量(semaphore)、事件(event)的區別

1、臨界區:通過對多執行緒的序列化來訪問公共資源或一段**,速度快,適合控制資料訪問。在任意時刻只允許乙個執行緒對共享資源進行訪問,如果有多個執行緒試圖訪問公共資源,那麼在有乙個執行緒進入後,其他試圖訪問公共資源的執行緒將被掛起,並一直等到進入臨界區的執行緒離開,臨界區在被釋放後,其他執行緒才可以搶占。

2、互斥量:採用互斥物件機制。 只有擁有互斥物件的執行緒才有訪問公共資源的許可權,因為互斥物件只有乙個,所以能保證公共資源不會同時被多個執行緒訪問。互斥不僅能實現同一應用程式的公共資源安全共享,還能實現不同應用程式的公共資源安全共享

3、訊號量:它允許多個執行緒在同一時刻訪問同一資源,但是需要限制在同一時刻訪問此資源的最大執行緒數目

4、事 件: 通過通知操作的方式來保持執行緒的同步,還可以方便實現對多個執行緒的優先順序比較的操作。

api函式見上一節。

注意點:能夠運用同步機制實現生產者和消費者例程

producer.c

/*producer.c*/

#include"shm_com.h"

#include"sem_com.h"

#include

int ignore_signal(void)

int main()

/*將共享記憶體位址對映到當前程序位址空間*/

shared_memory=shmat(shmid,0,0);

if(shared_memory==(void*)-1)

printf("memory attached at %p\n",shared_memory);

/*獲取共享記憶體的對映位址*/

shm_buff_inst=(struct shm_buff *)shared_memory;

do shm_buff_inst->pid=getpid();

sem_v(semid);

}while(strncmp(shm_buff_inst->buffer,"quit",4)!=0);

/*刪除訊號量*/

del_sem(semid);

/*刪除共享記憶體到當前程序位址空間中的對映*/

if(shmdt(shared_memory)==-1)

exit(0);

}customer.c/* customer.c */

#include"shm_com.h"

#include"sem_com.h"

int main()

/*獲得共享記憶體*/

shmid=shmget(ftok(".",'c'),sizeof(struct shm_buff),0666|ipc_creat);

if(shmid==-1)

/*將共享記憶體位址對映到當前程序位址空間*/

shared_memory=shmat(shmid,0,0);

if(shared_memory==(void *)-1)

printf("memory attached at %p\n",shared_memory);

/*獲得共享記憶體的對映位址*/

shm_buff_inst=(struct shm_buff *)shared_memory;

do shm_buff_inst->pid=0;

memset(shm_buff_inst->buffer,0,shm_buff_sz);

sem_v(semid);

}while(1);

/*刪除共享記憶體到當前程序位址空間中的對映*/

if(shmdt(shared_memory)==-1)

/*刪除共享記憶體*/

if(shmctl(shmid,ipc_rmid,null)==-1)

exit(0);

}sem_com.c

/*sem_com.c*/

#include"sem_com.h"

/*訊號量初始化(賦值)函式*/

int init_sem(int sem_id,int init_value)

return 0;

}/*從系統中刪除訊號量的函式*/

int del_sem(int sem_id)

}/*p操作函式*/

int sem_p(int sem_id)

return 0;

}/*v操作函式*/

int sem_v(int sem_id)

return 0;

}sem_com.h/*sem_com.h*/

#include

#include

#include

#include

#include

union semun

;/*訊號量初始化(賦值)函式*/

int init_sem(int sem_id,int init_value);

/*從系統中刪除訊號量的函式*/

int del_sem(int sem_id);

/*p操作函式*/

int sem_p(int sem_id);

/*v操作函式*/

int sem_v(int sem_id);

shm_com.h/*shm_com.h*/

#include

#include

#include

#include

#include

#include

#include

#define shm_buff_sz 2048

struct shm_buff

;執行結果:

執行緒的同步 互斥機制

整理執行緒同步的 api函式及其作用 執行緒同步的方式和機制 臨界區 互斥量 事件 訊號量四種方式 臨界區 critical section 互斥量 mutex 訊號量 semaphore 事件 event 的區別 1 臨界區 通過對多執行緒的序列化來訪問公共資源或一段 速度快,適合控制資料訪問。在...

linux執行緒》同步互斥機制之 互斥鎖

本文基於訊號量 如果訊號量的值最多為1,那實際上相當於乙個共享資源在任意時刻最多只能有乙個執行緒在訪問,這樣的邏輯稱為 互斥 這時,有一種更加方便和語義更加準確的工具來滿足這種邏輯 互斥鎖。幾個執行緒同時去搶乙個鎖,誰搶到了鎖就進門把房間鎖上,訪問資料,出來後之前解鎖。照這樣的邏輯,互斥鎖的操作無非...

執行緒間同步機制 互斥鎖

互斥以排他方式防止共享資料被併發修改。互斥量從本質來說是一把鎖,是乙個二元變數,其狀態為開鎖 允許0 和上鎖 禁止1 在訪問共享資源前對互斥量進行設定 加鎖 在訪問完成後釋放 解鎖 互斥量。1 在訪問該資源前,首先申請該互斥鎖,如果該互斥鎖處於開鎖狀態,則申請到該鎖物件,並立即占有該鎖 使該鎖處於鎖...