1. 程式人生 > >執行緒間同步三種方法

執行緒間同步三種方法

一、互斥鎖(mutex)

通過鎖機制實現執行緒間的同步。

  1. 初始化鎖。在Linux下,執行緒的互斥量資料型別是pthread_mutex_t。在使用前,要對它進行初始化。
    靜態分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    動態分配:int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex_attr_t *mutexattr);
  2. 加鎖。對共享資源的訪問,要對互斥量進行加鎖,如果互斥量已經上了鎖,呼叫執行緒會阻塞,直到互斥量被解鎖。
    int pthread_mutex_lock(pthread_mutex *mutex);
    int pthread_mutex_trylock(pthread_mutex_t *mutex);
  3. 解鎖。在完成了對共享資源的訪問後,要對互斥量進行解鎖。
    int pthread_mutex_unlock(pthread_mutex_t *mutex);
  4. 銷燬鎖。鎖在是使用完成後,需要進行銷燬以釋放資源。
    int pthread_mutex_destroy(pthread_mutex *mutex);

二、條件變數(cond)

互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞一個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數分為兩部分: 條件和變數。條件本身是由互斥量保護的。執行緒在改變條件狀態前先要鎖住互斥量。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:一個執行緒等待"條件變數的條件成立"而掛起;另一個執行緒使"條件成立"(給出條件成立訊號)。條件的檢測是在互斥鎖的保護下進行的。如果一個條件為假,一個執行緒自動阻塞,並釋放等待狀態改變的互斥鎖。如果另一個執行緒改變了條件,它發訊號給關聯的條件變數,喚醒一個或多個等待它的執行緒,重新獲得互斥鎖,重新評價條件。如果兩程序共享可讀寫的記憶體,條件變數可以被用來實現這兩程序間的執行緒同步。

  1. 初始化條件變數。
    靜態態初始化,pthread_cond_t cond = PTHREAD_COND_INITIALIER;
    動態初始化,int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
  2. 等待條件成立。釋放鎖,同時阻塞等待條件變數為真才行。timewait()設定等待時間,仍未signal,返回ETIMEOUT(加鎖保證只有一個執行緒wait)
    int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
    int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);
  3. 啟用條件變數。pthread_cond_signal,pthread_cond_broadcast(啟用所有等待執行緒)
    int pthread_cond_signal(pthread_cond_t *cond);
    int pthread_cond_broadcast(pthread_cond_t *cond); //解除所有執行緒的阻塞
  4. 清除條件變數。無執行緒等待,否則返回EBUSY
    int pthread_cond_destroy(pthread_cond_t *cond);

三、訊號量(sem)

如同程序一樣,執行緒也可以通過訊號量來實現通訊,雖然是輕量級的。訊號量函式的名字都以"sem_"打頭。執行緒使用的基本訊號量函式有四個。

  1. 訊號量初始化。
    int sem_init (sem_t *sem , int pshared, unsigned int value);
    這是對由sem指定的訊號量進行初始化,設定好它的共享選項(linux 只支援為0,即表示它是當前程序的區域性訊號量),然後給它一個初始值VALUE。
  2. 等待訊號量。給訊號量減1,然後等待直到訊號量的值大於0。
    int sem_wait(sem_t *sem);
  3. 釋放訊號量。訊號量值加1。並通知其他等待執行緒。
    int sem_post(sem_t *sem);
  4. 銷燬訊號量。我們用完訊號量後都它進行清理。歸還佔有的一切資源。
    int sem_destroy(sem_t *sem);

相關推薦

執行同步方法

一、互斥鎖(mutex) 通過鎖機制實現執行緒間的同步。 初始化鎖。在Linux下,執行緒的互斥量資料型別是pthread_mutex_t。在使用前,要對它進行初始化。 靜態分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITI

java 創造執行 Thread 的方法

發現 java 的不少例子中都涉及到執行緒,看來執行緒是 java 蠻重要的一部分的。 但最近看 執行緒 的一些講解時,覺得並不是很好理解,有點抽象。 邊看邊總結吧。 最近查閱到:java 程式設計一般情況下用不到多執行緒。多執行緒一般在開發 web 時 用到。 執行執行緒

linux執行同步(通訊)的幾方法——互斥鎖、條件變數、訊號量、讀寫鎖

Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。  下面是思維導圖:  一、互斥鎖(mutex)    鎖機制是同一時刻只允許一個執行緒執行一個關鍵部分的程式碼。 1 . 初始化鎖 int pthread_mutex_init(p

linux c 執行同步(通訊)的幾方法--互斥鎖,條件變數,訊號量,讀寫鎖

轉載自:https://blog.csdn.net/vertor11/article/details/55657619Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。 下面是思維導圖: 一、互斥鎖(mutex)   鎖機制是同一時刻只允

C#執行同步的幾實現方式

一、使用訊號量 using System; using System.Threading; namespace SemaphoreDemo { class Program { static void Main(string[] args)

Linux多執行程式設計---執行同步(互斥鎖、條件變數、訊號量和讀寫鎖)

本篇博文轉自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了多種方式來處理執行緒同步,最常用的是互斥鎖、條件變數、訊號量和讀寫鎖。  下面是思維導

執行基礎二(執行的啟動、終止,執行面臨的問題)

一、執行緒的啟動、終止方式   啟動: start native(呼叫外部介面啟動)     終止:    stop(類似kill,暴力終止)  interrupt 中斷的方式 通過指令的方式 volatile boolean stop

程序通訊和執行同步區別

執行緒間通訊:由於多執行緒共享地址空間和資料空間,所以多個執行緒間的通訊是一個執行緒的資料可以直接提供給其他執行緒使用,而不必通過作業系統(也就是核心的排程)。 程序的通訊機制主要有:管道、有名管道、訊息佇列、訊號量、共享空間、訊號、套接字。 linux中程序間通訊和執行緒間通訊的區別:

建立執行常用的兩方法

1,實現Runnable方法 /** * 宣告實現 Runnable 介面的類。該類然後實現 run 方法。然後可以分配該類的例項,在建立 Thread 時作為一個引數來傳遞並啟動 * * * @author cuijiao * @date 2017年12月26日 */

QT 呼叫執行 linux指令碼的方法

在linux系統下,Qt執行shell命令的方式有3種: (1)QProcess:execute("ls"); (2)system("ls"); (3)QProcess *process = new QProcess(); process->start("ls"); 注1:以上

執行停止的方式

執行緒停止的三種方式 設定標記位 使用stop()方法強制使執行緒退出 使用Thread.interrupt() 設定標記位,可以使執行緒正常退出 使用stop方法強制使執行

執行開啟的4方法

//Task t = new Task();//(方法一) //Thread t = new Thread();//(方法二) //TaskFactory tf = new TaskFactory();//(方法三) //通過委託 開啟一個執行緒 //(方法四) //VS新建控制檯指令碼 .

Java執行同步(詭異的IllegalMonitorStateException )

  前兩天去面試,被問到了一個執行緒同步的問題,兩個執行緒依次輸出1……100,一個執行緒只輸出奇數,一個只輸出偶數。之前工作中沒寫過執行緒同步的程式碼,只知道使用object的wait()和notify()方法可以實現執行緒同步,之前也看過執行緒池實現的程式碼,用的也是wait()和not

實現執行的第方式 實現Callable介面

package com.juc; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /**

正確實現子執行任務全部完成後主執行關閉的四方法

方法一 Thread.sleep 方法二 ExecutorService 方法三 thread.join 方法四 Thread.yield and Thread.

程序、執行的幾通訊方式

一、程序通訊 幾種程序間的通訊方式 (1) 管道(pipe):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有血緣關係的程序間使用。程序的血緣關係通常指父子程序關係。 (2)有名管道(named pipe):有名管道也是半雙工的通訊方式,但是它允許無

Java多執行建立的方式與對比

一、繼承Thread類建立執行緒類 1、定義Thread類的子類,並重寫該類的run()方法,該run()方法的方法體代表了執行緒需要完成的任務,即執行緒的執行體。 2、建立Thread子類的例項,即建立執行緒物件。 3、呼叫執行緒物件的start()方法來啟動該執行緒

50、多執行建立的方式之實現Runnable介面

實現Runnable介面建立執行緒 使用Runnable建立執行緒步驟: package com.sutaoyu.Thread; //1.自定義一個類實現java.lang包下的Runnable介面 class MyRunnable implements Runnable{ /

LinuxC高階程式設計——執行同步

 LinuxC高階程式設計——執行緒間同步 宗旨:技術的學習是有限的,分享的精神是無限的。 1、 互斥鎖mutex         多個執行緒同時訪問共享資料時可能會衝突。對於多執行緒的程式,訪問衝突的問題是很普遍的,解決的辦法是引入互斥鎖(Mutex, Mutual

JAVA多執行實現的方式及內部原理

JAVA多執行緒實現方式主要有三種:繼承Thread類、實現Runnable介面、使用ExecutorService、Callable、Future實現有返回結果的多執行緒。其中前兩種方式執行緒執行完