關於pv操作部分的內容,其實算不上什麼新的東西。但是它對於我們理解訊號量、訊息處理部分的工作還是有很大幫助的。之前我們給出了乙個win32的處理方案,但是實現的比較草率。所以我們今天可以利用linux上的訊號量函式把這個功能重新實現一遍。
(1)linux下面訊號量的基本函式
a)建立訊號量 sem_init
b)等待訊號量 sem_wait
c)釋放訊號量 sem_pos
d)刪除訊號量 sem_destroy
(2)編寫pv操作函式
之前在編寫pv操作的時候,沒有考慮到訊息處理的時序問題,所以在某些極端的情況下可能會造成一些問題。所以本次pv操作採用了迴圈佇列的形式,保持了訊息的先**隊順序。這樣對於執行緒收到的各種訊息就可以依次進行處理解決了。同樣,我們檔案編譯的方法非常簡單,shell下輸入gcc sem.c -g -o sem -lpthread即可。
可能有同學會問,單獨的迴圈佇列和pv操作處理上有什麼差別?其實差別很簡單,pv可以是不同執行緒向乙個執行緒傳送訊息,而迴圈佇列只能接受乙個執行緒傳送的訊息,否則處理上就麻煩了。
#include #include #include #include #include struct msg
;#define status int
#define true 1
#define false 0
static struct msg* p_msg = null;
struct msg* alloc_msg(int count)
memset(p_msg, 0, sizeof(struct msg));
p_msg->count = count;
p_msg->p_buffer = (int*)malloc(sizeof(int)* count);
if(null == p_msg->p_buffer)
sem_init(&p_msg->s_empty, 0, count);
sem_init(&p_msg->s_full, 0, 0);
sem_init(&p_msg->s_msg, 0, 1);
return p_msg;
error2:
free(p_msg);
error1:
return;
}void del_msg(struct msg* p_msg)
sem_destroy(&p_msg->s_msg);
sem_destroy(&p_msg->s_full);
sem_destroy(&p_msg->s_empty);
free(p_msg); }}
status put_msg(struct msg* p_msg, int data)
sem_wait(&p_msg->s_empty);
sem_wait(&p_msg->s_msg);
p_msg->p_buffer[p_msg->start] = data;
p_msg->start = (p_msg->start + 1) % p_msg->count;
sem_post(&p_msg->s_msg);
sem_post(&p_msg->s_full);
return true;
}status get_msg(struct msg* p_msg, int* p_buf)
sem_wait(&p_msg->s_full);
sem_wait(&p_msg->s_msg);
p_buf[0] = p_msg->p_buffer[p_msg->end];
p_msg->end = (p_msg->end + 1)% p_msg->count;
sem_post(&p_msg->s_msg);
sem_post(&p_msg->s_empty);
return true;
}void* set_func(void* args)
return null;
}void* get_func(void* args)
return null;
}int main(int argc, char* ar**)
if(pthread_create(&pid1, null, set_func, null))
if(pthread_create(&pid2, null, get_func, null))
while(1)
end:
return 1;
}
隨想錄(linux下的pv操作)
關於pv操作部分的內容,其實算不上什麼新的東西。但是它對於我們理解訊號量 訊息處理部分的工作還是有很大幫助的。之前我們給出了乙個win32的處理方案,但是實現的比較草率。所以我們今天可以利用linux上的訊號量函式把這個功能重新實現一遍。1 linux下面訊號量的基本函式 a 建立訊號量 sem i...
隨想錄(uclibc的學習)
對於交叉工具鏈來說,uclibc一般都是包括在工具鏈裡面的。通過uclibc,大家可以像開發x86使用者程式一樣,開發其他cpu上的應用程式。uclibc相比較glibc而言,包含的檔案較少,功能也有刪減,且每乙個目錄代表乙個動態庫,閱讀起來基本不會遇到什麼問題。1 uclibc的 怎麼看?建議直接...
隨想錄(epoll的使用)
要說linux下面最好用的介面恐怕就是epoll了。不管是網路程式設計,還是其他pipe程式設計,使用epoll都很方便。而且,epoll的函式個數少,結構也非常簡單。一般只要學好了epoll create epoll ctl epoll wait close這四個函式就可以了。如果大家有這方面的需...