有時候需要用一些後台執行緒來完成計算,這些計算往往都是一次性的,執行緒計算完後便結束。這時候可以使用條件變數,但是有點浪費,我們只需要獲取一次結果。c++標準庫中有標頭檔案,很形象「未來」,獲取未來計算的結果。
使用std::async來啟動乙個非同步任務。用std::future物件來儲存非同步任務返回的結果,這個物件儲存結果。當我們需要結果時,只需呼叫get()方法。這時如果還沒計算完畢,當前執行緒會阻塞。
#include#includeint find_the_answer_to_ltuae();
void do_other_sutff();
int main()
int find_the_answer_to_ltuae()
void do_other_sutff()
可以像執行緒那樣,向函式傳遞引數
#include#include#includestruct x
;x x;
auto f1 = std::async(&x::foo, &x, 32, "hello");//p->foo(42,"hello")。p是&x
auto f2 = std::async(&x::bar, x, "goodbye");"goodbye")。x是tmp
struct y
;y y;
auto f3 = std::async(y(), 3.141);//tem(3.141),tmp是y()的move-constructed
auto f4 = std::async(std::ref(y), 2.718);//y(2.718)
x baz(x&);
std::async(baz, std::ref(x));//呼叫baz
class move_only
;auto f5 = std::async(move_only());//構造臨時物件執行
可以通過傳遞引數來決定是否啟動新的執行緒或何時啟動新執行緒,
auto f6 = std::async(std::launch::async, y(), 1.2);//啟動新執行緒執行
auto f7 = std::async(std::launch::deferred, baz, std::ref(x));//呼叫wait或get後才執行
auto f8 = std::async(
std::launch::deferred | std::launch::async,
baz, std::ref(x));//由實現來選擇
auto f9 = std::async(baz, std::ref(x));
f7.wait();//執行f7對應的後台執行緒
可以使用std::packaged_task<>和future結合。當啟用std::package_task<>時,呼叫future的函式。函式返回結果存在關聯的資料中。
std::package_task<>的引數是函式簽名(像函式指標定義)。例如,void()表示無返回值,無引數的函式;int (std::sgring&,double*)表示函式返回型別為int,引數為string引用和double型別指標。當定義std::package_task<>物件時,必須給出引數和返回型別。
std::future<>的返回型別通過成員函式get_future()獲得。
在許多gui框架中,要求從特定的執行緒更新gui。如果乙個執行緒想要更新gui,它必須給gui執行緒傳送乙個訊息。可以通過std::package_task來解決這個問題。
#include#include#include#include#includestd::mutex m;
std::deque> tasks;
bool gui_shutdown_message_received();
void get_and_process_gui_message();
void gui_thread()//gui執行緒
task();//執行task }}
std::thread gui_bg_thread(gui_thread);
templatestd::futurepost_task_for_gui_thread(func f)
同步併發操作之等待乙個事件或條件
兩個執行緒需要同步操作時,可以設定乙個全域性變數,用互斥量保護這個全域性變數,通過這個全域性變數來同步。但是這樣太浪費cpu,這時可以用休眠方法。bool flag std mutex m void wait for flag 但是很難確定休眠時間的長短,太長或太短都不合理。在c 庫中,可以使用條件...
檔案操作 一次性產生多個檔案
函式原型為 int sprintf char str,const char format,1 根據格式從字串中提取資料。如從字串中取出整數 浮點數和字串等。2 取指定長度的字串 3 取到指定字元為止的字串 4 取僅包含指定字符集的字串 5 取到指定字符集為止的字串 其實說白了,這個函式用法跟prin...
pymysql一次性執行多條語句之坑
記錄一下今天使用pymysql遇到的乙個小小的問題,其實說是坑,不如說是自己平時沒有注意的乙個細節,寫下來,加深一下印象。為了提高效率,使用executemany一次性執行多條sql語句,將所有的資料庫操作都封裝到了類中,以下只把問題中用到的 抽象如下 def update self,data li...