如何將參數(例如指向結構的指針)傳遞給信號處理程序? 我正在寫一個多線程應用程序,所以我不能使用全局變量將參數傳遞給信號處理程序C
我將一個計時器與每個線程關聯。當計時器到期時,我必須更新一個結構(每個線程都有不同的結構)。
我該怎麼辦?
如何將參數(例如指向結構的指針)傳遞給信號處理程序? 我正在寫一個多線程應用程序,所以我不能使用全局變量將參數傳遞給信號處理程序C
我將一個計時器與每個線程關聯。當計時器到期時,我必須更新一個結構(每個線程都有不同的結構)。
我該怎麼辦?
系統調用信號處理程序的方式是固定的 - 無法對其進行更改並添加額外的用戶指針。因此,如果您想要將其他數據添加到信號處理程序中,唯一的辦法是使用全局變量(可能是線程本地)。
但是,如果您嘗試在線程中使用timer_create
,則使用SIGEV_THREAD
而不是SIGEV_SIGNAL
要好得多。後者發送信號給進程而不是線程,所以它可能被進程中的任何線程捕獲。
glibc似乎懶惰地和動態地分配_Thread_local變量(帶有成功或死亡的malloc調用,我不太喜歡它),所以看起來至少第一次訪問_Thread_local可能是AS不安全的。雖然我找不到更多信息。 – PSkocik
POSIX計時器允許使用sigevent(7)中記錄的struct sigevent
結構來指定過程將如何通知到期的詳細信息。
要通過上下文信息,爲產生信號siggnal處理程序,可以設置.sigev_value.sival_ptr
成員,其信號處理程序然後將能夠檢索(你需要通過的struct sigaction
的.sa_sigaction
成員設置信號處理程序,同時確保結構的.sa_flags
或SA_SIGACTION
)。
那麼使用線程局部變量呢? –
如何將線程局部變量傳遞給信號處理程序? – WindowsEFI
你能更清楚嗎?告訴我們什麼是信號類型?你希望輸出的格式是什麼! –