話不多說,先上**
#pragma once
#include
#include
#include
#include
#include
#include
#include
#include
const
int max_threads =
1000
;typedef std::function<
void
(void
)> task;
int num =0;
class
threadpool
;threadpool::
threadpool
(int number)
:stop
(false
)for
(int i =
0; i < number; i++)}
inline threadpool::
~threadpool()
}bool threadpool::
(task task)
void
* threadpool::
worker
(void
* arg)
void threadpool::
run())
;if(this
->tasks_queue.
empty()
)else
}}
主要測試task的個數和所開執行緒數對完成時間的影響。
測試**中task是計算密集型任務:for迴圈累加。**如下:
#include
#include
"threadpool.h"
#include
using
namespace std;
int show_res =0;
mutex data_mutex;
class
test
//sleep(500);
unique_lock
lk(data_mutex)
; show_res++
;//cout << show_res << endl;}}
;int
main()
*/ cout <<
"start tag="
<< show_res << endl;
for(
int i =
0; i < test_num; i++
)while
(show_res < test_num-1)
cout <<
"end tag="
<< show_res << endl;
end =
gettickcount64()
; cout <<
"spend time:"
<< end - start <<
"mileseconds"
<< endl;
exit(0
);}
測試結果說明:
測試一:程序數執行任務數:10
時間10
1203ms
91078ms
81329ms
71250ms
61484ms
51359ms
41765ms
31266ms
21984ms
13547ms
測試二:程序數在每乙個任務中新增乙個sleep(100);
執行任務數:10
時間10
1281ms
91265ms
81563ms
71563ms
61547ms
51421ms
41765ms
31578ms
22485ms
14453ms
結合測試一和測試二
有乙個猜想:單程序執行完所有任務的時間除以核心數(本次為4)約等於多個執行緒同時執行任務所需的時間。
所以並不是執行緒越多,執行的速度越快。
同時還需要考慮到是cpu密集型還是io密集型
cpu密集型的測試:在任務中執行大量的計算或者迴圈任務
io密集型的測試:在任務中使用sleep()函式阻塞
測試三:程序數cpu密集型:
執行任務數:10
時間10
1156ms
91125ms
81531ms
71453ms
61515ms
51235ms
41703ms
31406ms
22125ms
13641ms
測試四:程序數io密集型:
執行任務數:10
時間10
625ms
9640ms
81141ms
71109ms
61140ms
51140ms
41719ms
31719ms
22719ms
14984ms
測試五:程序數io密集型:
執行任務數:100
時間10
5062ms
202563ms
501078ms
100641ms
200640ms
由測試五的結果中可以看出,對於io密集型的任務來說,超過cpu核心數的執行緒數對於執行速度有較大的提公升
因為多執行緒的使用,使得每個執行緒在等待io結果的時間段內cpu可以被其它的執行緒使用。
測試六:程序數cpu密集型:
執行任務數:100
時間10
5672ms
205766ms
505250ms
1005062ms
2005031ms
48047ms
119172ms
由測試六的結果中可以看出,對於cpu密集型的任務來說,超過cpu核心數的執行緒數對於執行速度提公升不大
可能有的一點速度提公升是在多執行緒時,執行此任務集合的執行緒數在系統中的比例較大,使的使用cpu的比例也提高
由此造成的其它程序任務使用cpu的時間被擠占,執行50以上執行緒時,可以明顯看到滑鼠反應速度下降
而且執行緒之間的切換也需要消耗時間
C 11 簡單實現執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後自動啟動這些任務。執行緒池執行緒都是後台執行緒。每個執行緒都使用預設的堆疊大小,以預設的優先順序執行,並處於多執行緒單元中。如果某個執行緒在託管 中空閒 如正在等待某個事件 則執行緒池將插入另乙個輔助線程來使所有處理器保持...
C 11 執行緒池實現
c 11中已經新增了跨平台的thread相關工具,在一些輕量級使用場景中,使用std thread無疑會給我們帶來很多方便。這裡使用它實現了乙個簡單的執行緒池 easythreadpool.h ifndef easy thread pool h define easy thread pool h i...
C 11 簡單實現執行緒池的方法
什麼是執行緒池 執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立線www.cppcns.com程後自動啟動這些任務。執行緒池執行緒都是後台執行緒。每個執行緒都使用預設的堆疊大小,以預設的優先順序執行,並處於多執行緒單元中。如果某個執行緒在託管 中空閒 如正在等待某個事件 則執行...