簡體   English   中英

linux中的pthread_mutex_t是否是可重入的(如果一個線程試圖獲取它已經持有的鎖,則請求成功)

[英]Does pthread_mutex_t in linux are reentrancy (if a thread tries to acquire a lock that it already holds, the request succeeds)

我來自 Java,所以我熟悉同步而不是互斥鎖。 我想知道 pthread_mutex_t 是否也是可重入的。 如果沒有,還有另一種機制嗎?

謝謝

這取決於互斥體類型,默認情況下不進行檢查,並且嘗試在同一線程中多次鎖定它會導致未定義的行為。 在這里閱讀。

您可以創建PTHREAD_MUTEX_RECURSIVE類型的互斥鎖,以便能夠遞歸鎖定它,這是通過向pthread_mutex_init提供具有所需互斥鎖類型的pthread_mutexattr_t來完成的

根據手冊,您可以將互斥對象聲明為 PTHREAD_MUTEX_RECURSIVE:

如果互斥鎖類型是 PTHREAD_MUTEX_RECURSIVE,則互斥鎖應維護鎖計數的概念。 當線程第一次成功獲取互斥鎖時,鎖計數應設置為 1。 每次線程重新鎖定此互斥體時,鎖定計數應加一。 每次線程解鎖互斥鎖時,鎖計數應減一。 當鎖計數達到零時,互斥鎖將可供其他線程獲取。 如果一個線程試圖解鎖一個它尚未鎖定的互斥鎖或一個已解鎖的互斥鎖,將返回一個錯誤。

另請參見pthread_mutex_attr_settype

默認情況下, pthread_mutex不是遞歸的,但有一種方法可以將其初始化為遞歸:

      pthread_mutexattr_t Attr;
      pthread_mutexattr_init(&Attr);
      pthread_mutexattr_settype(&Attr, PTHREAD_MUTEX_RECURSIVE);
      pthread_mutex_init(&_mutex, &Attr);

我認為您的意思不是可重入性,而是遞歸性。 使用 Java 進行可重入鎖定是不可能的。
遞歸鎖定只是當您已經擁有線程中的鎖時,您可以再次鎖定它而不會出現任何問題。 實際上這是非常有效的,因為這不需要任何原子操作,只需將互斥鎖的擁有線程 id 與當前線程 id 進行比較,如果兩者相等,則擁有計數器是 - 非原子的(!) -遞增。
重入是在同一個線程中異步執行。 例如,如果您在 C/C++ 中有一個信號處理程序,並且此信號處理程序再次在代碼的同步部分鎖定該線程已經擁有的互斥鎖。 我不知道是否有可以處理這種情況的互斥鎖實現,但沒有太多需要,所以我猜不是。 我認為這樣的互斥鎖不能像普通的遞歸互斥鎖那樣高效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM