利用PPL實現複雜的多執行緒模式的生產者 消費者

2021-09-30 11:39:23 字數 3729 閱讀 7369

[作者]

常用網名: 豬頭三

出生日期: 1981.xx.xx

生理特徵: 男

婚姻狀況: 已婚

個人**: 

email:    [email protected]

qq交流:643439947

程式設計生涯: 2023年~至今[13年]

職業生涯: 11年

開發語言: c/c++、80x86asm、object pascal、c#

開發工具: vc++、vc#、delphi

技能種類: 逆向 驅動 磁碟 檔案

研發領域: windows應用軟體安全/windows系統核心安全/windows系統磁碟資料安全

專案經歷: 磁碟效能優化/檔案系統資料恢復/檔案資訊採集/敏感檔案監測跟蹤/網路安全檢測

[序言]

至於為什麼要研究ppl, 還是因為5年前的問題至今沒有解決:如何讓檔案遍歷更加快~~例如我們需要統計某個資料夾的總大小,或者某個分割槽裡所有檔案的總大小.這是在做類似系統維護工具, 必須要處理的問題.通過這段時間認真學習和測試ppl的各種理論, 終結如下:

1> 如果任務僅僅是列舉檔案而不做任何操作, ppl是無法提公升效能以及效率. 執行速度跟非ppl一樣.

2> ppl對操作跟磁碟io沒有關係的運算非常快, 比如數值演算法

3> ppl在商業軟體開發上, 做任務並行處理非常方便. 比如防毒軟體在做全盤掃瞄, 如果用ppl來做時,可以把掃瞄, 分析(動態脫殼, 特徵碼搜尋, md5校驗, pe頭檢查...)等把各種行為按照任務來進行併發處理,

4> 一般來說作為乙個普通的軟體開發人員在使用ppl時按照任務為單位的並行處理, 可以讓你避免各種多執行緒開發的各種坑爹行為.

[什麼是ppl]

parallel programming in visual c++

[**演示]

這2天我花費10多個小時來嘗試寫出類似防毒軟體做全盤掃瞄檔案的並行**, 此**僅僅是一種思路, 利用了生產者-消費者的多執行緒理論. 生產者是列舉全盤檔案並把目錄和檔案分別分發給消費者, 讓消費者對目標檔案或者目錄進行病毒分析, 比如: 動態脫殼, 特徵碼搜尋, md5校驗, pe頭檢查...此**僅僅用到的ppl裡面的:concurrency::combinable、concurrency::concurrent_queue、concurrency::parallel_for_each這3個東西卻實現了複雜的多執行緒模式的生產者-消費者機制.

#include "stdafx.h"

#include #include #include #include #include #include #include // 統計目錄/檔案的數量以及大小總量

concurrency::combinable<__int64> g_int64_dirs_count;

concurrency::combinable<__int64> g_int64_files_count;

concurrency::combinable<__int64> g_int64_allfiles_size;

// 判斷全盤列舉檔案任務是否退出

concurrency::combinableg_int_filesfinder_i***it;

// 統計耗時 (單位:毫秒)

template __int64 time_call(function&& funpoint_param_fun)

// 獲取所有碟符

void fun_getalllogicaldrivename(std::vector& vector_drivename)

case drive_remote:

break;

case drive_cdrom:

break;

case drive_ramdisk:

break;

default:

break;

}pwchar_drivename += lstrlenw(pwchar_drivename) + 1;}}

// 久不用c++了,釋放空間引起異常,懶得修改

//deletepwchar_drivename;

}// end fun_getalllogicaldrivename()

// 列舉系統目錄

void fun_finddirsandfiles(cstringw str_param_rootdir,

concurrency::concurrent_vector& cvector_param_dirsandfiles,

concurrency::concurrent_queue& cqueue_param_dirs,

concurrency::concurrent_queue& cqueue_param_files)

cstring_rootpath += "*.*";

bool bool_finding = class_dirandfilefinder.findfile(cstring_rootpath);

while (bool_finding)

else if (class_dirandfilefinder.isdirectory())

else if (!class_dirandfilefinder.isdirectory())

}class_dirandfilefinder.close();

return;

}// end fun_finddirsandfiles()

// 對目錄進行操作

void fun_ppldo_dirs(concurrency::combinable& int_param_i***it,

concurrency::concurrent_queue& cqueue_param_dirs)

else}}

}}// end fun_ppldo_dirs()

// 對檔案進行操作

void fun_ppldo_files(concurrency::combinable& int_param_i***it,

concurrency::concurrent_queue& cqueue_param_files)

else}}

}}// end fun_ppldo_dirs()

int _tmain(int argc, _tchar* ar**)

); // 設定結束標誌位

g_int_filesfinder_i***it.local() += 1;

},[&],

[&]);

});std::wcout << l"目錄總數: " << g_int64_dirs_count.combine(std::plus<__int64>()) << std::endl;

std::wcout << l"檔案總數: " << g_int64_files_count.combine(std::plus<__int64>()) << std::endl;

if (int64_elapsed < 1000)

else

// 暫停

std::cin.get();

return 0;

}// end _tmain()

PHP利用CURL MULTI實現多執行緒

php中的curl multi一類函式可以實現同時請求多個url,而不是乙個乙個依次請求,這就類似乙個程序實現了多個執行緒的功能,因此可以使用php利用curl multi實現完成多執行緒類的任務,下面就乙個利用php curl multi多執行緒採集網頁為例來說明一下。檢視 列印01 02 功能 ...

利用多執行緒實現報表的高效匯出

多執行緒 執行緒池 並發包每當談起這些詞彙,可能不是在面試就是在準備面試的路上了。有句話叫 面試造航母,工作擰螺絲 確實很多情況下我們是用不到這些東西的,但是學好這些東西對我們的日常工作也可能會產生意想不到的好處的。臨近年末,收拾了下手頭工作,趁著最後兩天有些閒暇,準備著手優化下前段時間業務人員反饋...

PHP利用CURL MULTI實現多執行緒爆破

第二天我通過各種網路搜尋又搞出了乙個更快的方法,使用curl multi這個東西我在網路上也沒看懂到底是怎麼回事,但是網上的文章都千篇一律,全是copy的,我也就依葫蘆畫瓢,拼拼湊湊勉強能夠執行,先貼出 function fn function writelog str if post nums a...