第10章 Posix訊號燈

2021-08-21 22:40:31 字數 2382 閱讀 6277

三種訊號燈

說明

p/v操作

互斥鎖、條件變數和訊號量之間的差別

#include /* for o_* constants */

#include /* for mode constants */

#include sem_t *sem_open(const char *name, int oflag);

sem_t *sem_open(const char *name, int oflag,mode_t mode, unsigned int value);

int sem_close(sem_t *sem);

int sem_unlink(const char *name);

link with -pthread.

mode:指定許可權位

value:指定訊號量的初始值

使用sem_open()開啟的訊號量使用sem_close()關閉,程序結束時會自動執行

posix訊號量至少是隨核心持續的,每個訊號量有乙個引用計數器記錄當前的開啟次數,引用計數大於0時,name就能從檔案系統中刪除,拆除卻要等到最後乙個sem_close()

#include int sem_wait(sem_t *sem);//被中斷返回eintr

int sem_trywait(sem_t *sem);//失敗返回eagain

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

int sem_post(sem_t *sem);

int sem_getvalue(sem_t *sem, int *sval);

create程式

#include	"unpipc.h"

int main(int argc, char **argv)

} if (optind != argc - 1)

err_quit("usage: semcreate [ -e ] [ -i initalvalue ] ");

sem = sem_open(argv[optind], flags, file_mode, value);

sem_close(sem);

exit(0);

}

semgetvalue程式

#include	"unpipc.h"

int main(int argc, char **argv)

semwait程式

#include	"unpipc.h"

int main(int argc, char **argv)

sempost程式

#include	"unpipc.h"

int main(int argc, char **argv)

1.介面

#include int sem_init(sem_t *sem,int shared,unsigned value);

int sem_destroy(sem_t *sem); //出錯返回-1

注意:

執行緒間共享訊號燈的乙個例子

#include	"unpipc.h"

#define nbuff 10

int nitems; /* read-only by producer and consumer */

struct shared;

void *produce(void *), *consume(void *);

int main(int argc, char **argv)

void *produce(void *arg)

return(null);

}void *consume(void *arg)

return(null);

}

訊號燈執行緒

這裡設定了乙個boolean的值,預設值是false 這裡面有二個執行緒,二個執行緒同時進入到tv 想象為容器 這個容器中 去拿資料!注意這裡有乙個boolean型別的燈!執行緒進去尋找方法!當boolean true的時候,生產表演了 voice!當boolean false的時候!就進去了!然後...

Posix多執行緒程式設計學習筆記(三) 訊號燈(1)

posix 有名訊號燈 函式sem open 建立乙個新的有名訊號燈或開啟乙個已存在的有名訊號燈。有名訊號燈總是既可用於執行緒間的同步,又可以用於程序間的同步。1.posix 有名訊號燈函式 1.名稱 sem open 功能 建立並初始化有名訊號燈 標頭檔案 include 函式原形 sem t s...

訊號燈與自旋鎖對比。

sem就是乙個睡眠鎖.如果有乙個任務試圖獲得乙個已被持有的訊號量時,訊號量會將其推入等待佇列,然後讓其睡眠。這時處理器獲得自由去執行其它 當持有訊號量的程序將訊號量釋放後,在等待佇列中的乙個任務將被喚醒,從而便可以獲得這個訊號量。訊號量一般在用程序上下文中.它是為了防止多程序同時訪問乙個共享資源 臨...