1:场景是有一个线程池
,我需要将任务队列
中发生读写事件的fd
拿出来传递到线程池
中
正常情况下创建线程时可以指定参数,比如这样
std::thread t(func,arg1,arg2,...)
但是我的fd
是在线程已经创建好之后传入,那该怎么办?
PHP中文网2017-04-17 14:03:09
執行緒之間傳遞資料並不需要什麼特殊的手段,因為執行緒的大部分資料都是共享的,全域變數、靜態全域變數和透過指標傳遞的資料都是可以直接在執行緒之間共享的。
所以最簡單的方法就是定義一個全域的佇列,這樣每個執行緒都可以存取到這個佇列,主執行緒把fd寫入佇列,執行緒池中的執行緒都從這個佇列中取資料就可以了。當然你也可以把隊列的引用透過參數傳給每一個執行緒。
考慮到這個C++標準函式庫的queue不是執行緒安全的,你可能需要用鎖來保證佇列的執行緒安全.
高洛峰2017-04-17 14:03:09
執行緒池接收的是一個操作,不是一個值…執行緒池裡的執行緒就算已經創建了也是阻塞在佇列裡…只需要往執行緒池裡投遞一個帶有fd的操作就可以了…
如果執行緒池裡已經有一個操作在阻塞等待fd進來,那也會存在一個條件變數去阻塞執行緒運行…fd準備好了通知條件變數就可以…