使用
posix 1003.1b
訊號量,有別於
systemv(ipc, semctl, semop)
的訊號量操作。
訊號量是為執行緒間共享的資源計數。訊號量的基礎操作是:原子性的增加計數,和等待直到計數器非空並且原子性的減少計數。
1)api
1.13 #include
訊號量初始化
int sem_init(sem_t *sem, int pshared, unsigned int value);
返回:
如果成功
0, 失敗設定
e***
到error
初始化sem
指標指向的訊號量,此訊號量的計數為
value。第2
個引數指明此訊號量是本地本程序使用(
0)還是程序間可以使用(非0)。
linux
執行緒當前不支援程序間使用。因此如果
pshared是非0
,將返回
enosys
錯誤。
1.14 #include
訊號量等待函式。相當於p原語
int sem_wait(sem_t * sem);
返回:
如果成功
0, 失敗設定
e***
到error
掛起呼叫此函式的執行緒直到
sem指標指向的訊號量不為
0。此函式將原子性的減少訊號量。
1.15 #include
sem_wait
的非阻塞版
int sem_trywait(sem_t * sem);
返回:
如果成功
0, 失敗設定
e***
到error
此函式是
sem_wait
的非阻塞版。如果
sem指向的訊號量是非
0值,那麼此計數將原子性的減少並且此函式立即返回
0。如果訊號量是
0,那麼
sem_trywait
函式立即返回錯誤
eagain。
1.16 #include
訊號量釋放操作。相當於原語v
int sem_post(sem_t * sem);
返回:
如果成功
0, 失敗設定
e***
到error
原子性的增加由
sem指向的訊號量計數。這個函式不會被阻塞。
1.17 #include
獲得訊號量
int sem_getvalue(sem_t * sem, int * sval);
返回:
如果成功
0, 失敗設定
e***
到error
獲得sem
指向的訊號量的指到
sval中。
1.18 #include
訊號量銷毀函式
int sem_destroy(sem_t * sem);
返回:
如果成功
0, 失敗設定
e***
到error
銷毀乙個訊號量物件,釋放他可能擁有的資源。在呼叫
sem_destroy
函式後沒有執行緒可以再等待此訊號量。在
linux
執行緒實現中,沒有資源於訊號量相關聯,因此
sem_destroy
事實上除了檢查沒有執行緒等待此訊號量外什麼也沒作。
2)example
/* file sem.c */
#include
#include
<
semaphore
.h>
#include
#define maxstack 100
int stack[maxstack][2];
int size=0;
sem_t sem;
/* 從檔案
1.dat
讀取資料,每讀一次,訊號量加一
*/void readdata1(void)
fclose(fp);}/*
從檔案2.dat
讀取資料
*/void readdata2(void)
fclose(fp);}/*
阻塞等待緩衝區有資料,讀取資料後,釋放空間,繼續等待
*/void handledata1(void)
}void handledata2(void)
}int main(void)
Unix環境多執行緒程式設計 二
資料定義標頭檔案 usr include bits pthreadtypes.h pthread attr t 執行緒屬性。屬性物件主要包括是否繫結 是否分離 堆疊位址 堆疊大小 優先順序 屬性值不能直接設定,須使用相關函式進行操作 每個屬性都有屬性名,可以單獨通過 pthread attr set...
Unix 多執行緒
unix 執行緒 先來介紹執行緒的最基本操作 由淺入深 執行緒建立 pthread t threadid 執行緒的id儲存型別 型別為unsuigned long int int pthread create pthread t,執行緒的唯一標識id const pthread attr t 優先順...
unix環境高階程式設計 執行緒解析
1 通過為每種事件型別分配單獨的處理執行緒,可以簡化處理非同步事件的 2 多個程序必須使用作業系統提供的複雜機制才能實現記憶體和檔案描述符的共享,而多個執行緒自動地可以訪問相同的儲存位址空間和檔案描述符 3 互動的程式可以通過使用多執行緒來改善響應時間,多執行緒可以把程式中處理使用者輸入輸出的部分與...