隨想錄(linux下的pv操作)

2021-06-08 16:48:36 字數 2277 閱讀 3416

關於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* argv)

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這四個函式就可以了。如果大家有這方面的需...