C 多執行緒處理求和問題

2021-08-02 09:37:59 字數 1891 閱讀 9145

c++ 11 的新標準支援了被封裝的多執行緒庫,雖然已經學過了c++ 的,但是今天想到用多執行緒處理一下求和的問題。

ok現在就直接先把**貼出來吧

ps:由於每個人的電腦的cpu核數都不同,我的電腦就是一台很爛的筆記本(雙核,除了打**和掃雷沒什麼其他東西),眾所周知,並行的時候如果執行緒超過cores會引起頻繁的上下文切換,這樣反而會降低效能,所以最好不要用超過你cores數目的執行緒去做計算量密集的處理

ps2:std::thread::hardware_concurrency()可以返回你的cpu核數,在c++庫不能返回cpu資訊下可能返回0

#include

#include

#include

#include

#include

#include

using

namespace

std;

vector

vec;

struct accumulate_block

};int multithreadsort(int init)

unsigned

long

const min_per_thread = 25;//每個執行緒的子串行大小

unsigned

long

const max_threads = (length + min_per_thread - 1) / min_per_thread;//計算執行緒數(向上取整)

unsigned

long

const hardware_threads = thread::hardware_concurrency();//獲取pc的cpu core數目,c++庫可能無法訪問該資訊,所以可能返回0

unsigned

long

const num_threads = min(hardware_threads != 0 ? hardware_threads : 2, max_threads);//最大執行緒數為最大執行緒數和硬體core數目中取較小者(執行緒數超過core數目反而降低效能)

unsigned

long

const block_size = length / num_threads;//重新計算每個執行緒需要執行的序列大小

vector

threads(num_threads - 1);

vector

results(num_threads);//每個執行緒的結果將儲存在results中

vector

::iterator block_start = vec.begin();

for (int i = 0; i < (num_threads - 1); i++)

accumulate_block mainaccu;

mainaccu(block_start, vec.end(), results[num_threads - 1]);

std::for_each(threads.begin(), threads.end(), std::mem_fn(&thread::join));//等待子執行緒完成

return

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

}int main()

int sum = multithreadsort(50);

cout

<< "sum is : "

<< sum << endl;

system("pause");

return

0;}

程式輸出:

sum is

5000

C 多執行緒處理

region 變數初始化 string tx 任務執行緒分派數 每次設定一組 一組十個執行緒 任務執行緒 限制最多十個執行緒 long threadcount 0 long maxthreadcount 10 manualreseteventslim manual new manualresetev...

C 多執行緒處理等待及執行緒超時問題

最近在寫個多執行緒自動化指令碼操作,但是發現會出現執行緒卡死的現象,因此需要去設定執行緒超時時間,經過一番研究總結了以下幾行 這裡貼出部分來作為記錄和參考 多個執行緒 public static void multiplethreads int th catch exception ex latch...

多執行緒問題及其處理

編寫乙個小的搶票程式 如下 package com.hbsi 模擬臨界資源的類 class tickets public void action string name 訪問資料的執行緒 class ticketsthread extends thread override public void ...