C 執行緒與執行緒池

2021-10-01 03:55:43 字數 4606 閱讀 9119

#include

#include

#include

std::

uint32_t

lwp_id()

c++11提供了對執行緒技術的支援,

#include

#include

#include

#include

#include

using

namespace std;

struct result

;void

f1(promise

&res));

}doublef2(

double x)

intmain

(int argc,

char

* ar**)

#pragma once

#ifndef thread_pool_h

#define thread_pool_h

#include

#include

#include

#include

#include

#include

namespace threadpool}~

threadpool()

m_cv.

notify_all()

;// 喚醒所有執行緒執行

for(std::thread& thread : m_pool)

} m_pool.

clear()

;}// 開啟執行緒池,重啟任務提交

void

reopen()

// 關閉執行緒池,停止提交新任務

void

close()

// 判斷執行緒池是否被關閉

bool

isclosed()

const

// 獲取當前任務佇列中的任務數

intgettasksize()

// 獲取當前空閒執行緒數

intidlecount()

// 提交任務並執行

// 呼叫方式為 std::futurevar = threadpool.submit(...)

// var.get() 會等待任務執行完,並獲取返回值

// 其中 ... 可以直接用函式名+函式引數代替,例如 threadpool.submit(f, 0, 1)

// 但如果要呼叫類成員函式,則最好用如下方式

// threadpool.submit(std::bind(&class::func, &classinstance)) 或

// threadpool.submit(std::mem_fn(&class::func), &classinstance)

template

<

classf,

class..

. args>

auto

submit

(f&& f, args&&..

. args)

->std::future<

decltype(f

(args...

))>

using rettype =

decltype(f

(args...

));// typename std::result_of::type, 函式 f 的返回值型別

std::shared_ptrrettype()

>> task = std::make_sharedrettype()

>>

( std::

bind

(std::forward

(f), std::forward

(args)..

.));

std::future future = task-

>

get_future()

;// 封裝任務並新增到佇列

addtask

([task]()

);return future;

}private

:// 消費者

task gettask()

// wait 直到有 task

if(m_isstoped)

assert

(!m_tasks.

empty()

);task task = std::

move

(m_tasks.

front()

);// 取乙個 task

m_tasks.

pop();

m_cv.

notify_one()

;return task;

}// 生產者

void

addtask

(task task)

;//對當前塊的語句加鎖, lock_guard 是 mutex 的 stack 封裝類,構造的時候 lock(),析構的時候 unlock()

m_tasks.

push

(task)

; m_cv.

notify_one()

;// 喚醒乙個執行緒執行

}// 工作執行緒主迴圈函式

void

scheduler()

}}};

}#endif

測試函式

#include

"threadpool.h"

#include

struct gfun};

#include

#endif

class

test};

intmain()

; test t;

std::cout <<

"at the beginning: "

<< std::endl;

std::cout <<

"idle threads: "

<< worker.

idlecount()

<< std::endl;

std::cout <<

"tasks: "

<< worker.

gettasksize()

<< std::endl;

std::future<

int> f1 = worker.

submit

(std::

bind

(&test::getthreadid,

&t,"123"

,456.789))

; std::cout <<

"after submit 1 task: "

<< std::endl;

std::cout <<

"idle threads: "

<< worker.

idlecount()

<< std::endl;

std::cout <<

"tasks: "

<< worker.

gettasksize()

<< std::endl;

std::future<

int> f2 = worker.

submit

(std::

mem_fn

(&test::getthreadid)

,&t,

"789"

,123.456);

std::cout <<

"after submit 2 task: "

<< std::endl;

std::cout <<

"idle threads: "

<< worker.

idlecount()

<< std::endl;

std::cout <<

"tasks: "

<< worker.

gettasksize()

<< std::endl;

std::future<

int> f3 = worker.

submit

(gfun,0

);std::cout <<

"f1 = "

<< f1.

get(

)<<

", f2 = "

<< f2.

get(

)<<

", f3 = "

<< f3.

get(

)<< std::endl;

std::cout <<

"after all task: "

<< std::endl;

std::cout <<

"idle threads: "

<< worker.

idlecount()

<< std::endl;

std::cout <<

"tasks: "

<< worker.

gettasksize()

<< std::endl;

return0;

}

c++11多執行緒與執行緒池

執行緒與執行緒池(一)

一.執行緒 當執行緒物件對建立後,即進入了新建狀態,如 thread t new mythread 就緒狀態 runnable 當呼叫執行緒物件的start 方法 t.start 執行緒即進入就緒狀態。處於就緒狀態的執行緒,只是說明此執行緒已經做好了準備,隨時等待cpu排程執行,並不是說執行了t.s...

c 執行緒池 多執行緒

1。設定引數類 using system using system.collections.generic using system.text public class stateinfo 執行緒開啟方法類 using system using system.collections.generic ...

std string與執行緒安全 C 實現執行緒池

平時注入一滴水,難時擁有太平洋。池化技術,通俗來講,就是提前儲存大量預分配資源,以備不時之需。執行緒池是一種多執行緒處理方式,其維護著多個執行緒,由監督者進行可併發任務的分配執行,從而避免了處理短任務時建立 銷毀程序的代價。執行緒池的必要性 多執行緒技術主要用以解決處理器單元內多個執行緒併發執行的問...