C 线程的创建
前言
線程創建很容易,直接調用std::thread,就創建一個新線程了。該線程拿到任務后立即開始執行。
線程的創建者(父線程)必須管理創建的線程(子線程),應該等到子線程完成其任務或者讓子線程從自己身上脫離。子線程可以通過復制或引用獲取任務執行的參數。
創建和執行線程
現在,更正式的方法創建線程:一個線程獲得一個Callable后立即啟動它。
Callable是一個行為類似于一個函數的實體。它可以是一個函數,一個函數對象或lambda函數。
函數對象是類的實例,調用操作符()被重載。函數和函數對象之間的關鍵區別在于,函數對象可以具有狀態。
lambda函數(匿名函數)是一個純函數體,沒有名字。它可以在適當的位置調用。lambda函數可以捕獲它的調用上下文。這就是為什么他們經常被稱為閉包。
不廢話了,看個例子吧:
//?createThread.cpp#include?#include?void?helloFunction()? {????std::cout?<<?"Hello?C 11?from?function."?<<?std::endl; }class?HelloFunctionobject? {public:????void?operator()()?const?{????????std::cout?<<?"Hello?C 11?from?a?function?object."?<<?std::endl;} };int?main()?{????std::cout?<<?std::endl;????//?線程執行函數?helloFunctionstd::thread?t1(helloFunction);????//?線程執行函數對象?helloFunctionobjectHelloFunctionobject?helloFunctionobject;????std::thread?t2(helloFunctionobject);????//?線程執行?lambda?functionstd::thread?t3([]?{????????std::cout?<<?"Hello?C 11?from?lambda?function."?<<?std::endl;?});????//?確保?t1,?t2?and?t3?在main函數結束之前結束t1.join();t2.join();t3.join();????std::cout?<<?std::endl; };12345678910111213141516171819202122232425262728293031323334353637383940414243所有線程t1、t2和t3將它們的輸出寫入控制臺。
線程t2的工作包任務是一個函數對象,線程t3的工作包任務是lambda函數。
主線程或父進程等待,直到它的子線程完成為止。
讓我們看一下輸出:
這兩個程序的執行結果在兩個方面有所不同。首先,子線程將以不同的順序執行。其次,輸出有點亂。因此,在第二次運行中,函數helloFunction的換行符發生在lambda函數調用之后。
總結
 
                            
                        - 上一篇: 免备案cdn加速(免备案云加速)
- 下一篇: C - 指针总结
