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,不懂,解释得不够详细阿