C 線程的創建

2021-03-02 輕鬆學C語言

線程創建很容易,直接調用std::thread,就創建一個新線程了。該線程拿到任務後立即開始執行。
線程的創建者(父線程)必須管理創建的線程(子線程),應該等到子線程完成其任務或者讓子線程從自己身上脫離。子線程可以通過複製或引用獲取任務執行的參數。

創建和執行線程

現在,更正式的方法創建線程:一個線程獲得一個Callable後立即啟動它。

Callable是一個行為類似於一個函數的實體。它可以是一個函數,一個函數對象或lambda函數。
函數對象是類的實例,調用操作符()被重載。函數和函數對象之間的關鍵區別在於,函數對象可以具有狀態。
lambda函數(匿名函數)是一個純函數體,沒有名字。它可以在適當的位置調用。lambda函數可以捕獲它的調用上下文。這就是為什麼他們經常被稱為閉包。

不廢話了,看個例子吧:

相關焦點

  • APUE作業:Linux C 簡單線程池實現
    但是無論如何,仍存在複製頁表的操作,這也是為什麼在UNIX(Linux) 下創建進程要比創建線程開銷大的原因。並發量一大,此時系統內便會有存在大量的進程,這會導致CPU花費大量的時間在進程調度上,並且進程上下文的切換開銷也很大。因此,相比於多進程模型,多線程是一個更優的模型:創建線程要快於創建進程,線程間的上下文切換消耗的時間一般也比進程要短。
  • pthread中線程是怎麼創建的(2)—glibc到內核
  • java的線程創建方式
    Thread類java語言中的Thread類是一個基本的線程類,用於創建線程、中斷線程、獲取線程的基本信息、運行狀態等。我們首先了解下利用Thread類創建線程實例的二種方式。繼承Thread類創建線程//繼承Thread實現自己的線程類class MyThread extends Thread{//重寫run方法,給線程賦予工作任務 @Override public void run() { //任務內容…… System.out.println("當前線程是:"+Thread.currentThread
  • 創建多少線程是合適的
    ,當線程a使用cpu的時候,線程b使用io,而當線程a使用io的使用線程b使用cpu,這個時候我們的cpu和io就可以達到100%。創建線程的多少,是要區分場景的,一般是cpu密集性和io密集性,這兩種場景的是不同的計算方式對於CPU密集型計算,多線程本質上就是提升多核cpu的利用率,所以一個4核的cpu,每一個核創建一個線程,理論上創建4個線程就可以了
  • pthread中線程是怎麼創建的(1)—glibc中的別名機制symver(symbol version)
  • 【Linux公開課】線程ID、創建與終止
    13.3 線程管理 線程管理包含了線程的創建、終止、等待、分離、設置屬性等操作。13.3.1 線程ID 線程ID 可以看作為線程的句柄,用來引用一個線程。 Pthreads線程有一個pthread_t類型的ID來引用。
  • C++多線程編程之創建線程的幾種方法
    << endl;  // 實際上這個是主線程在執行,主線程從main()函數返回,則整個進程執行完畢。    return 0;}主線程從main()函數開始執行,當我們自己創建線程時,也需要從一個函數開始運行(初始函數),一旦這個函數運行完畢,就代表我們這個線程運行結束。
  • UNIX(多線程):07---線程啟動、結束,創建線程多法、join,detach
    線程啟動、結束,創建線程多法、join,detach範例演示線程運行的開始和結束#include
  • 使用匿名內部類:創建線程的兩種方式
    線程的創建有兩種方式,昨天學習過其中的一種:創建一個類,繼承自Java裡的Thread類,並重寫run方法。最後再創建自定義線程的對象,並調用start方法,這樣就啟動一個線程了。那麼Thread到底是個什麼東西呢?
  • C++並發與多線程__C++如何線程創建線程以及函數join()和detach()用法和區別
    前言:通常一個程序運行起來,也就等於一個進程在運行,這個進程中會有一個主線程自動創建並運行,當程序的main()函數返回之後那麼此主線程也就運行結束
  • Java創建線程安全的單例singleton
    Java創建線程安全的單例單例的使用場景JVM中僅需要一個實例,因此能節省內存,加快訪問速度,比如資料庫連接池,計數器等。單線程的單例如果多線程下,如果第一個線程執行檢查instance是否為null,如果為null,執行創建一個Singleton1的實例,在實例未被初始化完畢的時候,第二個線程檢查instance是否為null,這時候是null
  • 阿里面試官問我Java線程和作業系統線程什麼關係
    線程有自己的獨立的上下文,由作業系統調度,但是也有一個缺點,那就是線程消耗資源太大了,例如在linux上,一個線程默認的棧大小是1M,單機創建幾萬個線程就有點吃力了。所以後來在程式語言的層面上,就出現了協程這個東西。協程的模式有點類似結合了上面二種方式,即是在用戶態做線程資源切換,也讓作業系統在內核層做線程調度。
  • Python sleep()函數用法:線程睡眠
    所謂暫停,即令當前線程進入阻塞狀態,當達到 sleep() 函數規定的時間後,再由阻塞狀態轉為就緒狀態,等待 CPU 調度。sleep() 函數位於 time 模塊中,因此在使用前,需先引入 time 模塊。
  • Java之創建多線程的第一種方式,thread類
    在java.long包下,有這樣一個類java.long.Thread類代表線程,所有的線程對象必須是Thread類或其子類的實例。每一個線程的作用是完成一定的任務,就是執行一段程序流即一段順序執行的代碼。Java中使用線程執行體來代表這段程序流。
  • 線程安全之std::atomic探索
    從不同線程訪問某個原子對象是良性(well-defined) 行為,而通常對於非原子類型而言,並發訪問某個對象(如果不做任何同步操作)會導致未定義(undefined) 行為發生。因此,從實現的原理上來,可以理解為原子類型在自己內部添加了互斥鎖。我們先創建一個CMake工程,並創建兩個線程來操作同一個全局變量,然後來編譯運行,查看它的結果。
  • c#.net多線程編程教學(3):線程同步
    正在閱讀:c#.net多線程編程教學(3):線程同步c#.net多線程編程教學(3):線程同步2005-07-07 10:44出處:作者:c-sharpcorner  System.Threading.Mutex用於對多個複雜的線程同步的問題,它也允許單線程的訪問。  像ManualResetEvent和AutoResetEvent這樣的同步事件類支持一個類通知其他事件的線程。  不討論線程的同步問題,等於對多線程編程知之甚少,但是我們要十分謹慎的使用多線程的同步。
  • UNIX(多線程):14---理解線程構造函數
    第一參數的類型並不是c語言中的函數指針(c語言傳遞函數都是使用函數指針),在c++11中,增加了可調用對象(Callable Objects)的概念,總的來說,可調用對象可以是以下幾種情況:函數指針示例void function_1() {}void function_2(int i) {}void
  • Java8線程池ThreadPoolExecutor底層原理及其源碼解析
    避免頻繁創建、銷毀線程的開銷; 復用創建的線程.及時響應提交的任務; 提交一個任務,不再是每次都需要創建新的線程.避免每次提交的任務都新建線程, 造成伺服器資源耗盡, 線程頻繁上下文切換等伺服器資源開銷.更容易監控、管理線程; 可以統計出已完成的任務數, 活躍的線程數, 等待的任務數等, 可以重寫hook方法beforeExecute, afterExecute
  • python核心編程之多線程教程-threading
    time.sleep(1)if __name__ == "__main__":for i in range(5):t = threading.Thread(target=saySorry)t.start() #啟動線程,即讓線程開始執行運行結果:說明可以明顯看出使用了多線程並發的操作
  • Java實現多線程的方式,啊四種
    >3、實現Callable接口,實現call()方法;4、通過線程池創建線程接下來一個一個說明:1、繼承Thread類,重寫run()方法線程類:測試類:測試類:運行結果:註:task.get()功能是獲取子線程的返回值,在得到返回值之前會一直阻塞主線程main。