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