C 11 執行緒池簡單實現

2021-10-03 12:20:47 字數 3434 閱讀 4941

話不多說,先上**

#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程後自動啟動這些任務。執行緒池執行緒都是後台執行緒。每個執行緒都使用預設的堆疊大小,以預設的優先順序執行,並處於多執行緒單元中。如果某個執行緒在託管 中空閒 如正在等待某個事件 則執行...