1:场景是有一个线程池,我需要将任务队列中发生读写事件的fd拿出来传递到线程池中正常情况下创建线程时可以指定参数,比如这样
线程池
任务队列
fd
std::thread t(func,arg1,arg2,...)
但是我的fd是在线程已经创建好之后传入,那该怎么办?
业精于勤,荒于嬉;行成于思,毁于随。
執行緒之間傳遞資料並不需要什麼特殊的手段,因為執行緒的大部分資料都是共享的,全域變數、靜態全域變數和透過指標傳遞的資料都是可以直接在執行緒之間共享的。 所以最簡單的方法就是定義一個全域的佇列,這樣每個執行緒都可以存取到這個佇列,主執行緒把fd寫入佇列,執行緒池中的執行緒都從這個佇列中取資料就可以了。當然你也可以把隊列的引用透過參數傳給每一個執行緒。 考慮到這個C++標準函式庫的queue不是執行緒安全的,你可能需要用鎖來保證佇列的執行緒安全.
隨便傳啊,例如全域變量,堆上的記憶體區塊,只要不是tls線程局部儲存的都可以用來傳輸,但前提是必須用鎖定控制。 你可以選擇互斥等來做讀寫控制。
tls
執行緒池接收的是一個操作,不是一個值…執行緒池裡的執行緒就算已經創建了也是阻塞在佇列裡…只需要往執行緒池裡投遞一個帶有fd的操作就可以了…如果執行緒池裡已經有一個操作在阻塞等待fd進來,那也會存在一個條件變數去阻塞執行緒運行…fd準備好了通知條件變數就可以…
Windows下可以考慮PostThreadMessage。
執行緒之間傳遞資料並不需要什麼特殊的手段,因為執行緒的大部分資料都是共享的,全域變數、靜態全域變數和透過指標傳遞的資料都是可以直接在執行緒之間共享的。
所以最簡單的方法就是定義一個全域的佇列,這樣每個執行緒都可以存取到這個佇列,主執行緒把fd寫入佇列,執行緒池中的執行緒都從這個佇列中取資料就可以了。當然你也可以把隊列的引用透過參數傳給每一個執行緒。
考慮到這個C++標準函式庫的queue不是執行緒安全的,你可能需要用鎖來保證佇列的執行緒安全.
隨便傳啊,例如全域變量,堆上的記憶體區塊,只要不是
tls
線程局部儲存的都可以用來傳輸,但前提是必須用鎖定控制。你可以選擇互斥等來做讀寫控制。
執行緒池接收的是一個操作,不是一個值…執行緒池裡的執行緒就算已經創建了也是阻塞在佇列裡…只需要往執行緒池裡投遞一個帶有fd的操作就可以了…
如果執行緒池裡已經有一個操作在阻塞等待fd進來,那也會存在一個條件變數去阻塞執行緒運行…fd準備好了通知條件變數就可以…
Windows下可以考慮PostThreadMessage。