在編寫多執行緒程式時,執行多少執行緒比較合適呢?執行緒並不是越多越好,理論上,硬體支援多少執行緒數,就開多少個執行緒比較合適,有的比如完成埠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...