同步併發操作之等待一次性事件

2021-06-26 17:07:58 字數 2144 閱讀 4294

有時候需要用一些後台執行緒來完成計算,這些計算往往都是一次性的,執行緒計算完後便結束。這時候可以使用條件變數,但是有點浪費,我們只需要獲取一次結果。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...