執行緒間之event

2021-10-01 11:16:15 字數 1724 閱讀 3338

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...