簡體   English   中英

信號處理程序中的pthread_exit()

[英]pthread_exit() in signal handler

(這個問題可能與信號處理程序中的pthread_exit有些相關導致分段錯誤 )我正在編寫一個引導鎖定防止庫,其中總有一個檢查線程正在執行圖形內容並檢查是否存在死鎖,如果有,那么它會發出一個信號沖突的線程。 當該線程捕獲信號時,它釋放它擁有並退出的所有互斥鎖。 有多個資源互斥(顯然)和一個關鍵區域互斥,所有獲取,釋放資源鎖定和執行圖形計算的調用必須首先獲得此鎖定。 現在出現了問題。 the program deadlocks after one thread gets killed. 使用2個競爭(不計算檢查線程)線程, 程序在一個線程被殺死后死鎖。 在gdb中,它說死線程擁有關鍵區域鎖定但從未釋放它。 在信號處理程序中添加斷點並單步執行后, 在pthread_exit()之前看起來鎖屬於其他人(正如預期的那樣),但是在pthread_exit()之后,所有權神奇地轉到了這個線程。

我能想到的唯一猜測是,當試圖獲得關鍵區域鎖定時,被殺死的線程在pthread_mutex_lock處阻塞(因為它需要另一個資源互斥鎖),然后信號來了,中斷了pthread_mutex_lock。 由於這個電話不是信號防范的,所以發生了一些奇怪的事情? 就像信號處理程序可能已經返回並且該線程獲得鎖定然后退出? Idk ..任何見解都表示贊賞!

pthread_exit不是異步信號安全的,因此您可以從信號處理程序調用它的唯一方法是確保信號不會中斷任何非異步信號安全功能。

作為一般原則,使用信號作為與線程通信的方法通常是一個非常糟糕的主意。 您最終會混淆兩個本身已經足夠困難的問題:線程安全(線程之間的正確同步)和單個線程內的重入。

如果您的信號目標僅僅是指示線程終止,那么更好的機制可能是pthread_cancel 但是,為了安全地使用它,將被取消的線程必須在適當的位置設置取消處理程序和/或在不安全時暫時禁用取消(使用pthread_setcancelstate )。 另外,請注意pthread_mutex_lock不是取消點。 沒有安全的方法來中斷被阻塞等待獲取互斥鎖的線程,因此如果您需要這樣的可中斷性,您可能需要更復雜的條件變量同步設置(condvar等待可取消),或者您可以使用信號量而不是互斥。

編輯:如果你確實需要一種方法來終止等待互斥鎖的線程,你可以用調用你自己的函數替換對pthread_mutex_lock的調用,該函數循環調用pthread_mutex_timedlock並在每次超時時檢查退出標志。

暫無
暫無

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

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