標頭檔案
#include
//c++11
建立執行緒
thread th
(myfunc)
;//建立乙個子執行緒,並且子執行緒開始執行,引數為可呼叫物件,可以是函式,仿函式,lambda表示式,下面給出例子
示例
void
myfunc()
class
myclass
void
func()
};intmain()
);thread t4
(&myclass::func,a(
));//t4使用類成員函式,成員函式隱含第乙個引數this
return0;
}
先看這幾行**
int
main()
);cout <<
"主線程"
<< endl;
return0;
}
由上面的例1我們知道,主線程和子執行緒執行時間和順序是不確定的,有可能只列印出"主線程",程序就結束了,子執行緒還沒來得及執行就被作業系統強行終止。並且還會丟擲異常。join()可以解決這個問題
int
main()
);cout <<
"主線程"
<< endl;
t.join()
;//主線程阻塞等待子執行緒執行完畢
return0;
}
與join()相對的,還有另一種方法是detach(),使用方法和join()類似
class
myclass};
intmain()
修改一下剛才的**:
class
myclass
void
operator()
()private
:int
& m_i;};
intmain()
類中含有乙個對外部變數的引用,子執行緒採用detach()方法脫離程序控制,當主線程結束,變數被銷毀,但是子執行緒中的引用仍然存在,屬於未定義行為。
綜上所述,執行緒t初始化時,是用淺拷貝複製的引數,只要引數(類)中不含引用和指標,就算安全的。前提知識:
joinable()作用:
先看個例子
//帶引數的
void
fun(
const
int& i,
char
*buf)
intmain()
既然指標是危險的,那麼怎麼傳遞字串呢?修改**如下
void
fun(
const
int& i,
const string& buf)
解決方法是避免隱式型別轉換,主動構造出臨時物件,修改**如下
thread th
(fun, n,
string
(str)
);
引用問題
以上問題僅對於detach,如果使用join就不存在這些問題
//用join方式傳參很簡單,不用搞那麼複雜
void
fptr
(unique_ptr<
int> ptr)
intmain()
多執行緒與併發
執行緒的部分功能就是實現併發,多個執行緒在每個執行緒上都可以執行小段的 處理器很快的在各個執行緒間進行切換,像是在同時執行,其實所有的 ios 裝置都還有第二個處理器,顯示介面卡 gpu 與顯示相關的 都由 gpu 獨立於主處理器之外執行.主線程自動有乙個執行迴圈 run loop 乙個run lo...
多執行緒 Java多執行緒與併發
實現的方式主要有三種 執行緒的狀態 基本差別 最主要的本質區別 兩個概念 鎖池 假設執行緒a已經擁有了某個物件 不是類 的鎖,而其他執行緒b c想要呼叫這個物件的某個synchronized方法 或者塊 由於b c執行緒在進入物件的synchronized方法 或者塊 之前必須先獲得該物件鎖的擁有權...
多執行緒與事務併發
多執行緒與事務併發 在實際問題中,不要在事件處理執行緒中做任何主要工作,而應當使用另外的執行緒作為工作執行緒,並允許事件處理執行緒快速地返回到處理事件等待狀態 這句話看起來非常有道理,多執行緒的優點要充分體現!那麼執行緒處理要完成的工作以及業務要處理的工作如何劃分?實際上這個問題可以歸結為控制驅動體...