c++多線程實現綁定cpu的方法詳解
windows多線程
windows.h中提供了多線程解決方案,創建多線程的函數為
//返回值:一個handle類型的值,表示線程的句柄,可用于等待線程等函數 handle createthread( lpsecurity_attributes lpthreadattributes, // 不用管,一般為null size_t dwstacksize, // 堆棧大小,一般為0,表示默認值 lpthread_start_routine lpstartaddress, // 函數指針 __drv_aliasesmem lpvoid lpparameter, // 參數指針 dword dwcreationflags, // 不用管,一般為0 lpdword lpthreadid // 線程id,一般設為null );
為了理解這個函數,下面舉一個最簡單的例子
#include<iostream> #include<windows.h> // 編寫了一個我的線程函數 dword winapi mythread(lpvoid ps) { int *n = (int *)ps; for (int i = 0; i < 3; ++i) printf("執行線程%d, i=%d\n", n[0], i); return 0l; } int main() { // 創造線程 int id1 = 1, id2=2; createthread(null, 0, mythread, &id1, 0, null); createthread(null, 0, mythread, &id2, 0, null); system("pause"); return 0; }
其中,mythread是一個用于創造新線程的函數,其輸入參數ps是一個lpvoid類型的指針,在參數傳入后,將這個指針轉為整形指針(int *),然后將其賦給另一個整形指針n,然后在for循環中引用這個整形指針。
在main函數中,通過createthread函數創建一個線程并執行,其中執行的函數為mythread,傳入的參數為id1, id2的地址。執行后的結果為
執行線程2, i=0
執行線程1, i=0
執行線程1, i=1
執行線程1, i=2
執行線程2, i=1
執行線程2, i=2
請按任意鍵繼續. . .
windows調度與綁定cpu
作為成熟的操作系統,windows為了更加充分利用cpu,會動態分配線程占用的cpu資源,以確保每個cpu核心不過累;另一方面,intel作為成熟的cpu,為了充分考慮性能和能耗之間的均衡,當cpu沒有滿負荷運行的時候會自動降頻。
這兩個合在一起就是,windows動態分配cpu核心,讓每個cpu都不過載;然后intel動態規劃能耗,讓每個核心都降頻。于是cpu的頻率越降越低,windows占用的資源越來越少,于是性能越來越差。
上面這個描述當然略顯夸張了,但道理是這么個道理,為了驗證這一點,可以將上面的mythread函數稍作改動,
dword winapi mythread(lpvoid ps) { int* n = (int*)ps; int cpu = getcurrentprocessornumber(); for (int i = 0; i < 5; ++i) { printf("在cpu%d上執行線程%d, i=%d\n", cpu, n[0], i); sleep(100); } return 0l; }
這樣就可以查看每次執行線程時所使用的cpu,發現每次運行時使用的cpu是隨機的。
通過windows.h中的setthreadaffinitymask來手動分配cpu,使用方法非常簡單
int main() { // 創造線程 int id1 = 1, id2=2; auto th1 = createthread(null, 0, mythread, &id1, 0, null); setthreadaffinitymask(th1, 0x01); auto th2 = createthread(null, 0, mythread, &id2, 0, null); setthreadaffinitymask(th2, 0x02); // 記得等待線程結束 system("pause"); return 0; }
效果如下
在cpu0上執行線程1, i=0
在cpu1上執行線程2, i=0
請按任意鍵繼續. . . 在cpu1上執行線程2, i=1
在cpu0上執行線程1, i=1
在cpu0上執行線程1, i=2
在cpu1上執行線程2, i=2
在cpu1上執行線程2, i=3
在cpu0上執行線程1, i=3
在cpu1上執行線程2, i=4
在cpu0上執行線程1, i=4
關于c++多線程實現綁定cpu的方法詳解的文章就介紹至此,更多相關c++多線程綁定cpu內容請搜索碩編程以前的文章,希望以后支持碩編程!