有件事需要注意,當把函式物件傳入到執行緒建構函式中時,需要避免
「最令人頭痛的語法解析
」(c++』s most vexing parse
, 中文簡介
)。如果你傳遞了乙個臨時變數,而不是乙個命名的變數;
c++編譯器會將其解析為函式宣告,而不是型別物件的定義。
例如:
std::thread my_thread(background_task());
這裡相當與宣告了乙個名為
my_thread
的函式,這個函式帶有乙個引數
(函式指標指向沒有引數並返回
background_task
物件的函式
),返回乙個
std::thread
物件的函式,而非啟動了乙個執行緒。
呼叫join()
的行為,還清理了執行緒相關的儲存部分,這樣
std::thread
物件將不再與已經完成的執行緒有任何關聯。這意味著,只能對乙個執行緒使用一次
join()
;一旦已經使用過
join()
, std::thread
物件就不能再次加入了,當對其使用
joinable()
時,將返回否(
false
) 。為了從
std::thread
物件中分離執行緒
(前提是有可進行分離的執行緒
):不能對沒有執行執行緒的
std::thread
物件使用
detach(),
也是join()
的使用條件,並且要用同樣的方式進行檢查
——當
std::thread
物件使用
t.joinable()
返回的是
true
,就可以使用
t.detach()
。
std::thread t(do_background_work);
t.detach();
assert(!t.joinable());
使用多執行緒方式開啟檔案:
void edit_document(std::string const& filename)
else
}}
如果使用者選擇開啟乙個新文件,為了讓迅速開啟文件,需要啟動乙個新執行緒去開啟新文件
①,並分離執行緒
②。與當前執行緒做出的操作一樣,新執行緒只不過是開啟另乙個檔案而已。所以,
edit_document
函式可以復用,通過傳參的形式開啟新的檔案。
併發程式設計實戰筆記 第2章
1 無狀態的物件一定是執行緒安全的。2 不恰當的執行時序,出現不正確的結果,定義為競態條件。3 單狀態變數,使用原子型別 4 多狀態變數互動,使用synchronzied,包括2部分,1 要鎖定的物件 2 要保護的 塊。被保護的 塊,操作可看成乙個事務。5 內建鎖是可重入的,也就是自己去獲取自己已經...
第 2 章 T SQL 程式設計
一 批處理 go 1,go是批處理的標誌 2.作用 可以使不在同一批處理語句中的sql語句相互不受影響 3.使用 把相互聯絡的放在同一批次,沒聯絡的放在不同批次 二變數 區域性變數,全域性變數 區域性變數和全域性變數的區別 區域性變數 定義它的區域性範圍內有效 1.必須以標記 作為字首,如 rew ...
第16章 網路程式設計 2
16.3 python中的網路程式設計 16.3.1 socket 模組函式 使用socket.socket 函式來建立套接字。socket socket family,socket type,protocol 0 import socket tcpsock socket.socket socket...