C語言描述線程間的同步與互斥 - 計算機java編程

2021-01-07 計算機java編程

一、實現線程間同步互斥的操作

1、線程間同步 ==== 有序執行法1、多個信號量  法2、條件變量+互斥鎖 ===>broadcast signal

2、線程間互斥 ==== "你死我活"法1、單個信號量  法2、互斥鎖

//1、互斥是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。//2、同步是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。//3、同步其實已經實現了互斥,所以同步是一種更為複雜的互斥。//4、互斥是一種特殊的同步。

二、為什麼要實現同步互斥

保護臨界資源

即全局變量

pthread_create之前的成為 全局資源 =====>當有線程操作全局資源的時候 ===>變為臨界資源

三、代碼示例

1、多個線程實現同步,定義多個信號量

同步是在互斥的基礎上實現有序。

2、互斥鎖實現線程互斥

同步是在互斥的基礎上實現有序。

互斥是一種特殊的同步

3、互斥鎖 + 條件變量 實現同步互斥

1)mutex + pthread_cond + pthread_cond_broadcast

//pthread_cond_wait() 用於阻塞當前線程,等待別的線程使用pthread_cond_signal()或pthread_cond_broadcast來喚醒它。 //pthread_cond_wait() 必須與pthread_mutex 配套使用。pthread_cond_wait()函數一進入wait狀態就會自動release mutex。//當其他線程通過pthread_cond_signal()或pthread_cond_broadcast,把該線程喚醒,使pthread_cond_wait()通過(返回)時,該線程又自動獲得該mutex。

當有多個線程時,使用pthread_cond_broadcast會喚醒所有阻塞的線程,因此不能高效保證其同步性。

2)mutex + pthread_cond + pthread_cond_signal

//pthread_cond_signal函數的作用是發送一個信號給另外一個正在處於阻塞等待狀態的線程,使其脫離阻塞狀,繼續執行//.如果沒有線程處在阻塞等待狀,pthread_cond_signal也會成功返回。//pthread_cond_signal只給一個線程發信號。//假如有多個線程正在阻塞等待著這個條件變量的話,那麼是根據各等待線程優先級的高低確定哪個線程接收到信號開始繼續執行。//如果各線程優先級相同,則根據等待時間的長短來確定哪個線程獲得信號。

先將pthread_cond_signal注釋掉,看看會有什麼現象

兩個線程都發送阻塞進入了睡眠,

疑問:創建線程時,線程運行進入阻塞,為什麼代碼能接著運行,而不是阻塞在阻塞處,不像下執行。

原因:在線程進入阻塞後,會自動釋放CPU控制權,進入阻塞。只有當中斷發生時,才會使線程從阻塞中跳出,即pthread_cond_signal喚醒阻塞線程

使用pthread_cond_signal喚醒指定的條件阻塞線程

相關焦點

  • Java並發編程學習前期知識上篇
    Java並發包JUC(java.util.concurrent)有了解過哪些?並發包實現最重要的是什麼?其原理是什麼知道嗎?何為JMM的可見性?volatiile關鍵字是怎麼實現變量可見性的?如果想要學好並發,弄懂理解透徹的話,凱哥覺得以下計算機的知識還是要了解了解。本次《Java並發編程-前期準備知識》凱哥準備用兩篇來介紹,主要包括以下內容:簡單介紹內存之間可見性是什麼?
  • Java多線程synchronized
    本篇主要介紹Java多線程中的同步,也就是如何在Java語言中寫出線程安全的程序,如何在Java語言中解決非線程安全的相關問題。
  • C語言伺服器編程必備常識
    man 2 sin 2表示系統調用,3表示c庫函數一旦子進程被創建,父子進程一起從fork處被創建。創建子進程為了爭奪資源。splice用於在兩個文件描述符間移動數據,零拷貝,用於socket和管道之間互相定向。tee用於兩個管道之間複製數據。IO處理單元是一個專門的接入伺服器,它實現負載均衡。請求隊列是系統內部各單元之間通信方式的抽象,一般實現為池。阻塞和非阻塞是對文件描述符而言的。
  • Linux Qt使用POSIX多線程條件變量、互斥鎖(量)
    嘎嘎之前一直在看POSIX的多線程編程,上個周末結合自己的理解,寫了一個基於Qt的用條件變量同步線程的例子。故此來和大家一起分享,希望和大家一起交流。提到線程,如果在UI編程中,總會和一些耗時操作聯繫在一起。
  • JAVA多線程 集合同步
    原文連結:http://www.javamadesoeasy.com/2015/12/how-to-synchronize-arraylist-in-java-to.html幾乎所有的集合非線程安全的?
  • c#.net多線程編程教學(3):線程同步
    正在閱讀:c#.net多線程編程教學(3):線程同步c#.net多線程編程教學(3):線程同步2005-07-07 10:44出處:作者:c-sharpcorner  System.Threading.Mutex用於對多個複雜的線程同步的問題,它也允許單線程的訪問。  像ManualResetEvent和AutoResetEvent這樣的同步事件類支持一個類通知其他事件的線程。  不討論線程的同步問題,等於對多線程編程知之甚少,但是我們要十分謹慎的使用多線程的同步。
  • 你好,世界 ——計算機程式語言的特點比較、應用與學習
    計算機程式語言的應用面向過程的程式語言,也叫命令式語言或者強制式語言,它是通過指令一列執行的運算的次序來描述技術過程。其主要是用函數來描述過程,所以程序中主要是函數,面向過程的語言應用環境簡單,系統規模小的應用多採用面向過程的思想,其中最具代表性的是C語言。
  • Java 中15種鎖的介紹:公平鎖,可重入鎖,獨享鎖,互斥鎖,樂觀鎖,分段鎖,自旋鎖等等
    互斥鎖 / 讀寫鎖互斥鎖在訪問共享資源之前對進行加鎖操作,在訪問完成之後進行解鎖操作。加鎖後,任何其他試圖再次加鎖的線程會被阻塞,直到當前進程解鎖。如果解鎖時有一個以上的線程阻塞,那麼所有該鎖上的線程都被編程就緒狀態, 第一個變為就緒狀態的線程又執行加鎖操作,那麼其他的線程又會進入等待。
  • 日常疑惑:編程學Java還是學C語言?
    這兩門程式語言都是IT行業的寵兒,Java與和C語言各自的技術特點、應用方向上有所不同,沒有伯仲之分,所以這也讓初學者們覺得很難選:應該選擇哪個做為入門語言呢?從學習的難易度上來說,java語言比C語言要簡單。
  • 「原創」Java並發編程系列09|基礎乾貨
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫本文為何適原創並發編程系列第9篇。現在,我們進入正題:介紹並發編程的基礎性概念。
  • Java 線程面試題 Top 50
    Java語言一個重要的特點就是內置了對並發的支持,讓Java大受企業和程式設計師的歡迎。大多數待遇豐厚的Java開發職位都要求開發者精通多線程技術並且有豐富的Java程序開發、調試、優化經驗,所以線程相關的問題在面試中經常會被提到。
  • 一篇文章全面吃透Java虛擬機,線程安全的實現方法
    由於java虛擬機的多線程是通過線程輪流切換並分配處理器執行時間的方式來實現的,所以,為了線程切換後能恢復到正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲,所以我們說,它是線程私有的.
  • Java基礎知識點面試手冊(線程+JDK8)
    此為下篇,內容包括:高並發編程,Java8新特性。高並發編程多線程和單線程的區別和聯繫:答:在單核 CPU 中,將 CPU 分為很小的時間片,在每一時刻只能有一個線程在執行,是一種微觀上輪流佔用 CPU 的機制。
  • C+11多線程編程(四)——原子操作
    今天和大家說說C++多線程中的原子操作。首先為什麼會有原子操作呢?這純粹就是C++這門語言的特性所決定的,C++這門語言是為性能而生的,它對性能的追求是沒有極限的,它總是想盡一切辦法提高性能。互斥鎖是可以實現數據的同步,但同時是以犧牲性能為代價的。口說無憑,我們做個實驗就知道了。
  • Java面試熱點學習:深入並發編程中的synchronized(前三章)
    小結並發編程時,會出現可見性問題,當一個線程對共享變量進行了修改,另外的線程並沒有立即看到修改後的最新值。比如一個線程在執行13: iadd時,另一個線程又執行9: getstatic。會導致兩次number++,實際上只加了1。小結並發編程時,會出現原子性問題,當一個線程對共享變量操作到一半時,另外的線程也有可能來操作共 享變量,幹擾了前一個線程的操作。
  • Java並發編程:synchronized
    三.synchronized同步方法或者同步塊若有不正之處,請多多諒解並歡迎批評指正。一.什麼時候會出現線程安全問題?不過,當多個線程執行一個方法,方法內部的局部變量並不是臨界資源,因為方法是在棧上執行的,而Java棧是線程私有的,因此不會產生線程安全問題。二.如何解決線程安全問題?那麼一般來說,是如何解決線程安全問題的呢?
  • 為什麼要學習「 C」程式語言?
    「 C」編程是另一種程式語言的基本基礎,像java、php,C++等熱門程式語言都是「 C」編程最為底層開發,所以我們通常稱「 C」編程編程「母語」。「 C」編程是一種簡單的語言,可以更快地執行。「 C」編程還是一種極其緊湊的語言,這意味著以「 C」編程方式尋址的程序可以在不同的機器上運行。C程式語言的優勢作為中級語言,C連接了低級和高級語言的功能。C語言可用於底層編程。例如用於內核和驅動程序的腳本,它還有助於使用高級程式語言,例如用於軟體應用程式的腳本等。
  • C 多線程的互斥鎖應用RAII機制
    什麼是RAII機制RAII是Resource Acquisition Is Initialization(翻譯成 「資源獲取即初始化」)的簡稱,是C 語言的一種管理資源RAII的做法是使用一個類對象,在對象的構造函數中獲取資源,在對象生命期內控制對資源的訪問,最後在對象消失時,其析構函數來釋放獲取的資源;這裡的資源可以是文件句柄,內存,Event,互斥量等等,由於系統的資源是有限的,就好比自然界的石油,鐵礦一樣,不是取之不盡,用之不竭的。所以,我們在編程安全上,要求必須遵循以下幾個步驟:1. 申請資源2.
  • 我和面試官的博弈:Java 並發編程篇
    而JUC(java.util.concurrent)裡的東西是並發編程的基石。上次的面試已經過去一段時間,在一邊努力工作的同時,我也一邊抽出時間準備 Java 並發編程的部分。今天懷著輕鬆愉快的心情,再次踏上我的大廠面試之旅。面試官:你先說下你對synchronized的了解。
  • 【每天學點新知識】Linux作業系統下C語言多線程同步使用指南!
    、設置線程屬性、線程運行函數的起始地址、傳入參數。 第二個參數pshared為0時,該進程內所有線程可用,不為0時不同進程間可用。 三、互斥鎖 頭文件和線程的相同: `#include ` * 1 使用方法: 創建