epoll在多執行緒下的使用

2021-09-22 08:00:50 字數 1322 閱讀 9903

首先讓我們思考乙個問題,當乙個程序正在阻塞在epoll_wait的時候,另乙個執行緒呼叫epoll_ctl時會發生什麼呢,這個動作安全嗎?

測試當epoll_wait期間另乙個執行緒執行epoll_ctl是否安全

其實這種動作是安全的(測試平台為linux,核心為4.4版本),先看一下man裡面的描述,可見是安全的。

1.下面讓我們來測試一下,首先把fd2加入監聽,然後再呼叫epoll_wait,在wait期間再另乙個執行緒在呼叫epoll_ctl把fd1加入監聽,然後再往fd1裡寫入資料,可見epoll_wait返回了,證明fd1加入之間沒有時間發生時,在wait期間把它加入監聽是安全的。**見下,有點亂,大家湊合著看吧。。。。

可見輸出為4,因為檔案描述符0,1,2被用掉了,然後先建立的fd2,後建立的fd1,所以fd2為3,fd1為4。

測試epoll_wait時另乙個執行緒關閉了監聽的檔案描述符

2.下面我們再測試一下在加入之間fd1就可讀時epoll_wait會不會丟失這個可讀事件,**稍微改一下就可,見下圖。

由上面結果可見,不會丟失可讀事件。

3.再考慮下如果在epoll_wait期間,另外乙個執行緒把其中的乙個監聽檔案描述符關閉了會怎麼樣。先看一段描述

測試**見下

可見是沒有影響的

4.但是讓我們再考慮一下,如果關閉了fd1之後又有別的執行緒開啟檔案後獲得的檔案描述符和以前關閉的一樣會有什麼影響呢。

可見關閉後再寫fd1對epoll是沒有影響的,即使關閉後又開啟時獲得的檔案描述符一樣,看起來效果就像當關閉這個檔案描述符時,就把它從監聽檔案描述符裡面給移除了。

在 DOS 下實現多執行緒

在 dos 下實現多執行緒 程式在 turbo c 3.0 下除錯通過,採用了最簡單的時間片輪轉法,實現了多執行緒的系統,程式盡量採用了最簡潔的技術來實現多工的系統,主要使用到了c標準庫中的setjmp和longjmp兩個函式,程式絕大部分都是採用c c 語言書寫,但是仍然不可避免的採用了三句內嵌彙...

PHP下使用多執行緒

本文以windows為例,講解安裝和使用php pthreads擴充套件。開啟 http localhost phpinfo 1 找到 php extension build 的版本 配置 php.ini 檔案,新增一行 extension php pthreads.dll重啟 apache 並檢視...

c 下使用多執行緒

執行緒主要由cup暫存器 呼叫棧 執行緒本地儲存器 thread local storage,tls 組成。cup暫存器主要記錄當前所執行執行緒的狀態,呼叫棧主要用於維護執行緒所呼叫到的記憶體和資料,tsl主要用於存放執行緒的狀態資訊。前台執行緒 只有所有的前台執行緒全部關閉,才能完成程式關閉。後台...