執行緒間通訊 同步

2021-09-27 13:32:43 字數 2151 閱讀 2567

同步

是指多個任務按照約定的先後次序 相互配合完成一件事情

訊號量:

由訊號量決定 執行緒是繼續執行 還是阻塞等待

訊號量代表某種資源 其值表示系統中該資源的數量

訊號量是乙個受保護的量 只能通過特定的三種操作來訪問

初始化p操作(申請資源, 有可能阻塞)

v操作(釋放資源, 不會阻塞)

p(s)操作 :

if(訊號量的值大於0 )

申請資源的任務繼續執行 訊號量-1

else

申請資源的任務阻塞·

v(s)操作 :

訊號量+1

if(有任務在等待資源 )

喚醒等待任務 讓其繼續執行

posix訊號量

內部定義了兩類訊號量:

無名訊號量 (基於記憶體的訊號量 主要用於執行緒間的同步 也可以用於程序之間

但是不方便)

有名訊號量(既可以用於程序 也可以用於執行緒)

訊號量操作函式:

#include

int sem_init(sem_t *sem, int pshared,unsigned int vaule) // 訊號量初始化

成功返回0 失敗返回eof

sem 指向要初始化的訊號量物件

pshared 0 - 執行緒間 1 - 程序間

val 訊號量初值

同檔案同上

int sem_wait(sem_t *sem); //p操作

int sem_post(sem_t *sem); //v操作

成功返回0 失敗返回eof

sem 指向要操作的訊號量物件

ps: 兩個執行緒同步讀寫緩衝區

char buf[32];

sem_t sem;

void *function(void *arg);

int main(void)

pthread_t a_thread;

if(sem_init(&sem,0, 0) < 0)

perror("sem_init");

exit(-1);

if(pthread_create(&a_thread, null, function, null) != 0)

printf("fila to pthread_create");

exit(-1);

printf("input 'quit' to exit\n");

dowhile(strncmp(buf, "quit", 4) != 0);

return 0;

void *function(void *arg)

while(1)

sen_wait(&sem);

printf("you enter %d characters\n", strlen(buf));

ps: l兩個執行緒同步讀寫

char buf[32];

sem_t sem_r, sem_w;

void *function(void *arg);

int main(void)

pthread_t a_thread;

if(sem_init(&sem_r,0, 0) < 0)

perror("sem_init");

exit(-1);

if(sem_init(&sem_w,0, 0) < 0)

perror("sem_init");

exit(-1);

if(pthread_create(&a_thread, null, function, null) != 0)

printf("fila to pthread_create");

exit(-1);

printf("input 'quit' to exit\n");

dowhile(strncmp(buf, "quit", 4) != 0);

return 0;

void *function(void *arg)

while(1)

sen_wait(&sem_r);

printf("you enter %d characters\n", strlen(buf));

sen_post(&sem_w);

命令: gcc -o test test.c -lpthread

程序間通訊 和 執行緒間同步

前經常搞混,所以記錄下來。程序間通訊主要是指多個程序間的資料互動。而執行緒間同步主要指維護多個執行緒之間資料準確 一致性。一.程序間通訊主要有以下幾種方式 管道 pipe 管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用。程序的親緣關係通常是指父子程序關係。有名管道 ...

python 執行緒間同步通訊condition鎖

import threading 條件變數,用於複雜的執行緒間同步 class xiaoai threading.thread def init self,lock super init name 小愛 self.lock lock def run self self.lock.acquire pr...

程序間通訊 執行緒同步 概要

關鍵區域。訪問的資源。叫臨界資源,比方印表機。訪問臨界資源的 叫臨界 區域。critical section物件沒有控制代碼,不能被其它執行緒共享。執行緒同步之 critical section 相互排斥量。mutex物件有控制代碼。所以也可用於不同程序的執行緒之間做同步。mutex有超時等待機制。...