zoukankan      html  css  js  c++  java
  • 第十一章 线程

    第十一章线程
    11.3线程标识
    每个线程也有一个线程ID,线程ID只有在它所属的进程上下文中才有意义。
    /* 比较两个线程ID,相等返回非0数值,否则返回0*/
    #include<pthread.h>
    int pthread_equal(pthread_t tid1, pthread_t tid2);
     
    /*  获得自身线程ID*/
    #include<pthread.h>
    int pthread_self(void);
    11.5线程终止
    如果进程中的任意线程调用了exit、_Exit或_exit ,那么整个进程就会终止。
    单个线程可以通过3种方式退出,因此可以在不终止整个进程的情况下,停止它的控制流。
    • 线程可以简单的从启动例程中返回,返回值是线程的退出码。
    • 线程可以被同一进程中的其他线程取消。
    • 线程调用pthread_exit。
    #include <pthread.h>
    void pthread_exit(void *rval_ptr);
    rval_ptr 参数是一个无类型的指针,进程中的其他线程也可以通过调用pthread_join函数访问这个指针。
    #include <pthread.h>
    int pthread_join(pthread thread, void **rval_ptr);
    调用线程将一直阻塞,直到指定的线程调用pthread_exit、从启动例程返回或者被取消。
    如果线程简单的从它的启动例程返回,rval_ptr就包含返回码。如果线程被取消,由rval_ret指定的内存单元就设置为PTHREAD_CANCELED.
     
    #incldue <pthread.h>
    int pthread_cancel(pthread_t tid);
    线程可以通过调用pthread_cancel函数来请求取消同一进程中的其他线程。
    #include <pthread.h>
    void pthread_cleanup_push(void (*rtn)(void*), void *arg);/* arg 是(*rtn的参数)*/
    void pthread_cleanup_pop(int execute);
    线程可以安排他退出时需要调用的函数。
    pthread_cleanup_push设置清除函数
    void pthread_cleanup_pop清除调用函数
    以下3个场景执行线程清理函数
    调用pthread_exit
    响应取消请求时
    用非0的execute参数调用pthread_cleanup_pop
     
    如果execute参数为0,清理函数将不被调用。
    11.6 线程同步
    11.6.1 互斥量
    互斥量(mutex)的本质是一把锁,在访问共享资源前对互斥量进行设置(加锁),在访问完后释放(解锁)互斥量。
    对互斥量进行加锁后,任何其他试图再次对互斥量加锁的线程都会被阻塞直到当前线程释放该互斥锁。
    如果释放互斥量时有一个以上的线程阻塞,那么该锁上的所有阻塞线程都会变成可运行状态,第一个变为可运行的线程就可以
    对互斥量加锁,其他线程就会看到互斥量依然是锁着的,只能回去再次等待它重新变为可用。
    互斥量是通过pthread_mutex_t数据类型表示的。在使用前,必须进行初始化。
    #include <pthread.h>
    int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *register attr);
     
    int pthread_mutex_destroy(pthread_mutex_t *mutex);
    init完,使用最后要调用destroy释放内存。
     
    /* 对互斥量进行加锁,需要调用lock.如果互斥量已经上锁,调用线程将阻塞直到互斥量被解锁,解锁调用unlock*/
    #include <pthread.h>
    int pthread_mutex_lock(pthread_mutex_t *mutex);
    int pthread_mutex_unlock(pthread_mutex_t *mutex);
     
     
     
    11.6.4 读写锁
    读写锁,有三种状态:读模式下加锁状态、写模式下加锁状态、不加锁状态。
    读写锁适合对数据结构读的次数远大于写的情况。
    #include <pthread.h>
    /* 初始化*/
    int pthread_rwlock_init (pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
    /* 销毁*/
    int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
    /* 加读锁*/
    int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
    /* 加写锁*/
    int   pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
    /* 解锁*/
    int   pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
    11.6.6 条件变量
    条件变量时线程可用的另一种同步机制。条件变量给多个线程提供了一个会合的场所。
    条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特点的条件发生。
    条件本身是由互斥量保护的。线程在改变条件状态前必须先锁住互斥量。其他线程在获得互斥量前不会察觉到这种改变,因为互斥量必须在锁定以后才能计算条件。
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    OLAP ODS项目的总结 平台选型,架构确定
    ORACLE ORA12520
    ORACLE管道函数
    ORACLE RAC JDBC 配置
    ORACLE RAC OCFS连接产生的错误
    ORACLE 启动和关闭详解
    OLAP ODS项目的总结 起步阶段
    ORACLE RAC 配置更改IP
    ORACLE RAC OCR cann't Access
    ORACLE RAC Debug 之路 CRS0184错误与CRS初始化
  • 原文地址:https://www.cnblogs.com/xiaodeyao/p/8849087.html
Copyright © 2011-2022 走看看