一、信号
1、信号的概念
信号是软件中断
信号的响应依赖于中断
2、signal();
void (*signal(int signum,void (*func)(int)))(int);
/*信号会打断阻塞的系统调用*/
3、信号的不可靠
4、可重入函数
所有的系统调用都是可重入的,一部分库函数也是可重入的,如:memcpy
5、信号的响应过程
信号从收到到响应有一个不可避免的延迟
标准信号的响应没有严格的顺序
6、常用函数
int kill(pid_t pid, int sig);/*发送信号一个进程*/
int raise(int sig); /*自己给自己发送信号*/
unsigned int alarm(unsigned int seconds);/*以秒为单位,发送一个SIGALRM信号后终止*/
int setitimer(int which,
const struct itimerval *new_value,
struct itimerval *old_value);
int pause(void);/*等一个信号*/
void abort(void);/*导致进程异常终止*/
int system(const char *command);/*执行shell命令*/
unsigned int sleep(unsigned int seconds);/*休眠指定的秒数*/
7、信号集
int sigemptyset(sigset_t *set);/*该函数的作用是将信号集初始化为空*/
int sigfillset(sigset_t *set);/*该函数的作用是把信号集初始化包含所有已定义的信号。*/
int sigaddset(sigset_t *set, int signum);/*该函数的作用是把信号signum添加到信号集set中*/
int sigdelset(sigset_t *set, int signum);/*该函数的作用是把信号signum从信号集set中删除*/
int sigismember(const sigset_t *set, int signum);/*判断signum是否在set中*/
8、信号屏蔽字/pending集的处理
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
/*how:SIG_BLOCK、SIG_UNBLOCK、SIG_SETMASK*/
sigpending();
9、扩展
sigsuspend();
sigaction();
setitimer();
10、实时信号
二、线程
1、线程的概念
一个正在运行的函数
posix线程是一套标准,而不是实现
openmp线程
线程标识:pthread_t
int pthread_equal(pthread_t t1, pthread_t t2);
/*比较线程的IDs*/
ppthread_t pthread_self(void);
/*获取调用的线程ID*/
2、线程的创建
/*thread:给一个pthread_t类型的地址,用于回填
*attr:线程属性
* 执行的函数
* arg: 给函数传数据(入口地址)
*/
int pthread_create(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine) (void *),
void *arg);
线程的调度取决于调度器策略
线程的终止
3种方式:1)线程从启动例程返回,返回值就是线程的退出码
2)线程可以被同一进程中的其他线程取消
3)线程调用pthread_exit()函数
pthread_join() --> wait();
栈的清理
void pthread_cleanup_push(void (*routine)(void *),void *arg);
void pthread_cleanup_pop(int execute);
线程的取消选项
线程取消: int pthread_cancel(pthread_t thread);
取消有2种状态:允许和不允许
允许取消又分为:异步cancel,推迟cancel(默认)->推迟至cancel点在响应
cancel点:POSIX定义的cancel点,都是可能引发阻塞的系统调用
pthread_setcanselstate();设置是否允许取消
pthread_setcanseltype();设置取消方式
pthread_testcancel();本函数什么都不做,就是一个取消点
3、线程同步
互斥量:pthread_mutex_t
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_once(pthread_once_t *once_control,
void (*init_routine)(void));
pthread_once_t once_control = PTHREAD_ONCE_INIT;
条件变量:pthread_cond_t
int pthread_cond_destroy(pthread_cond_t *cond);
int pthread_cond_init(pthread_cond_t *restrict cond,
const pthread_condattr_t *restrict attr);
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);
4、线程属性
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
线程同步的属性
互斥量属性:
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
int clone(int (*fn)(void *),
void *child_stack,
int flags, void *arg, ...
/* pid_t *ptid, void *newtls, pid_t *ctid */ );
5、重入
多线程中的IO
线程与信号
int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
int sigwait(const sigset_t *set, int *sig);
int pthread_kill(pthread_t thread, int sig);
线程与fork