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