LinuxC:并发

一、信号

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值