C 併發程式設計 在執行時選擇執行緒數量

2021-08-04 16:22:52 字數 1913 閱讀 8374

在編寫多執行緒程式時,執行多少執行緒比較合適呢?執行緒並不是越多越好,理論上,硬體支援多少執行緒數,就開多少個執行緒比較合適,有的比如完成埠iocp中建議開2倍執行緒數,因為考慮到有些執行緒可能會掛起等情況。但最重要的一條,首先要獲取當前硬體支援的執行緒數,通常情況下為cpu核數。

std:

:thread

::hardware_concurrency(); //獲取當前cpu核心數量

**示例:

以下**為std::accumulate的簡單並行版本實現,通過將大量的累加操作,分配給多個執行緒去計算,最後將各個執行緒計算的結果累加,得出最終結果。真正的平行計算任務分割是很麻煩的,這裡並不需要考慮執行緒的同步等問題。

template

struct accumulate_block

};template

t parallel_accumulate(iterator first,iterator last,t init)

accumulate_block()(block_start,last,results[num_threads-1]); //計算剩下的數,相當於在主線程中計算

std::for_each(v_threads.begin(),v_threads.end(),std::mem_fn(&std::thread::join));//等待所有執行緒計算完成

return

std::accumulate(results.begin(),results.end(),init);

}int _tmain(int argc, _tchar* argv)

//std::distance原始碼

template

class _diff> inline

void _distance2(_bidit _first, _bidit _last, _diff& _off,

bidirectional_iterator_tag)

template

inline

typename iterator_traits<_init>::difference_type

distance(_init _first, _init _last)

//std::advance源**

// template function advance

template

class _diff> inline

void _advance(_init& _where, _diff _off, input_iterator_tag)

template

class _diff> inline

void _advance(_fwdit& _where, _diff _off, forward_iterator_tag)

template

class _diff> inline

void _advance(_bidit& _where, _diff _off, bidirectional_iterator_tag)

template

class _diff> inline

void _advance(_ranit& _where, _diff _off, random_access_iterator_tag)

template

class _diff> inline

void advance(_init& _where, _diff _off)

//獲取硬體執行緒數量

static

unsigned

int hardware_concurrency() _noexcept

c 11併發程式設計歷程(6)在執行時選擇執行緒的數量

執行緒的開闢數量如何在執行時決定,看乙個簡單的例子 include include include include include include template typename iterator,typename t class accum 多執行緒求和函式 template typename...

C 在執行時動態建立型別

c 在執行時動態的建立型別,這裡是通過動態生成c 源 然後通過編譯器編譯成程式集的方式實現動態建立型別 public static assembly newassembly n private system.componentmodel.icontainer components null npro...

C 型別 物件 執行緒棧和託管堆在執行時的關係

我們將討論型別 物件 執行緒棧和託管堆在執行時的相互關係,假定有以下兩個類定義 internal class employee public virtual string getprogressreport public static employee lookup string name inte...