apue读书笔记-第十二章
1 可重入,線程安全,異步信號安全之間的區別?
? ?可重入:可以重復進入,不會引起問題(這個概念最寬)
? ?線程安全:被多個線程使用時,不會出問題,也就是可以被多個進程重入(新函數和被終端和被中斷的函數不在同一線程)
? ?異步信號安全:可以被信號函數重入(信號處理函數和被中斷的函數在同一線程)
? ?可重入必然線程安全,必然異步信號安全
? ?線程安全與異步信號沒有關系
? ?舉個例子,一個函數使用了全局變量,那么它是不可重入的,但是如果給它加上鎖(),那么它就是線程安全的,但是不是異步信號安全的,因為此時會死鎖
? ?那么如何讓它成為異步信號安全的呢?在函數開頭阻塞所有信號,結尾解除阻塞,那么它就是異步信號安全的了,當然,它鎖
死鎖的例子:
? ?
#include"../apue.h"pthread_mutex_t mut; void sig_usr1(int n) {printf("%s\n","usr1");pthread_mutex_lock(&mut);pthread_mutex_unlock(&mut);printf("%s\n","usr1 end");return ; }int waga() { static int n1=0;pthread_mutex_lock(&mut);printf("%s\n","lock");if(n1==0)raise(SIGUSR1);n1++;sleep(1);pthread_mutex_unlock(&mut);printf("%s\n","unlock"); } int main() {pthread_mutexattr_t attrt;pthread_mutexattr_init(&attrt);pthread_mutexattr_setpshared(&attrt,PTHREAD_MUTEX_NORMAL); pthread_mutex_init(&mut,&attrt);signal(SIGUSR1,sig_usr1);waga(); }
?
2,取消點有什么用?
? ?線程并不會立即響應cancel請求,而是在取消點響應
3,多線程的fork怎么處理?
? ? ?父線程獲取鎖——fork——父線程釋放,子線程釋放
? ? 多線程fork會引起很多問題,這里有一些討論http://blog.codingnow.com/2011/01/fork_multi_thread.html
習題1,fork復制了標準io庫緩沖區,所以會看到重復的輸出
習題3,可以,而且要保證調用的函數同樣是異步信號安全的
習題7,不懂,解釋得不夠詳細阿
轉載于:https://www.cnblogs.com/mightofcode/archive/2013/01/13/2857750.html
總結
以上是生活随笔為你收集整理的apue读书笔记-第十二章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 逗比个性签名女生
- 下一篇: Android窗口管理服务WindowM