eventfd()建立了乙個「eventfd物件」, 通過它能夠實現使用者態程式間。
此物件包含了乙個被核心所維護的計數(uint64_t), 初始值由initval來決定。
eventfd在核心裡的核心是乙個計數器counter,它是乙個uint64_t的整形變數counter,初始值為initval。
1.read(eventfd_read)
消費者需要對訊號量進行down操作時,呼叫read從eventfd讀即可。read返回值:
如果當前counter > 0,那麼read返回counter值,並重置counter為0;
如果當前counter等於0,那麼read 1)阻塞直到counter大於0;2)如果設定了nonblock,那麼返回-1,並設定errno為eagain。
可以看到,eventfd實現的資源是一次性消耗品,只允許一次read。
2.write(eventfd_write)
生產者需要執行up操作時,呼叫write寫乙個64bit的整數value到eventfd即可。write返回值:
counter最大能儲存的值是 0xffff ffff ffff fffe(以max表示此值),那麼write嘗試將value加到counter上,如果結果超過max,那麼write一直阻塞直到有read操作發生,或者返回-1並設定errno為eagain。
所以write可以多次連續呼叫,但read讀一次即可清零。實質上它應該是乙個二元訊號量,只有0和非0兩種狀態。
*int eventfd(unsigned int initval, int flags);建立乙個eventfd檔案描述符
int eventfd_read(int fd, eventfd_t value); 向eventfd中寫入乙個值
int eventfd_write(int fd, eventfd_t value); 從eventfd中讀出乙個值
#include #include #include #include #include int main(int argc, char**ar**)
efd = eventfd(0,0);
if (-1 == efd)
switch(fork())
}return;
}int main(int argc, char**ar**)
ievtfd = eventfd(0,0);
if (-1 == ievtfd)
g_ievtfd = ievtfd;
memset(&stevent, 0, sizeof(struct epoll_event));
stevent.events = (unsigned long) epollin;
stevent.data.fd = ievtfd;
iret = epoll_ctl(iepfd, epoll_ctl_add, g_ievtfd, &stevent);
if (0 != iret)
iret = pthread_create(&stwthread, null, eventfd_child_task, null);
if (0 != iret)
for(;;)
printf("read %llu (0x%llx) from ievtfd\n", uiread, uiread);}}
close(g_ievtfd);
close(iepfd);
return 0;
}
使用Event同步執行緒
win32寫多執行緒的時候經常需要執行緒同步,同步的方法很多,效率也不一樣,這裡介紹一種event同步物件。建立乙個mfc基於dialog的工程,介面如圖 執行緒部分 全部為全域性變數和函式 const int max thread 3 handle hevent null handle to ev...
VC之 執行緒同步之事件物件 Event
事件物件也是核心物件,它也包含三個成員 使用計數 指明事件是自動重置事件還是乙個人工重置事件的布林值 指明事件是處於已通知狀態還是處於未通知狀態。人工重置的事件物件 當人工重置的事件物件得到通知時,等待該事件物件的所有執行緒均變為可排程執行緒。在擁有事件物件的所有權之後要呼叫resetevent函式...
執行緒間通訊之Handler
使用handler在主線程和子執行緒之間傳遞訊息的機制,就是通過handler獲取主線程的訊息佇列,將子執行緒的訊息傳送到主線程的訊息佇列,由looper取出後交給目標handler處理。looper 首先主線程會初始化時呼叫looper.prepare 建立主線程的looper,建立的looper...