美文网首页
系统编程--线程

系统编程--线程

作者: 魔芋辣椒 | 来源:发表于2020-09-02 17:17 被阅读0次

    一、线程概念

    线程:有独立pcb,没有独立空间
    进程:有pcb,有独立空间
    查看线程

    ps  -Lf 进程号
    lwp线程号 
    

    二、线程函数

    gcc后要加-pthread

    2.1线程id

    与线程号不同,id用来标示进程内线程,号用来cpu分配资源

    pthread_t pthread_self(void);
    

    2.2 创建线程

    int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
    /*
    thread  传出参数,传出创建的线程
    attr 线程属性
    routine  线程执行函数
    arg  函数参数
    */
    

    案例

    void *tfn(void *args){
      int i=(int)args;
      printf("son thread %d  pid=%d, tid=%lu",i,getpid(),pthread_self());
      return NULL;
    }
    
    int main(){
      pthread_t pid;
    for(int i=0;i<5;i++)
      pthread_create(&pid,NULL,tfn,(void*)i);
    }
    

    2.3 退出线程

    exit是退出进程

    void pthread_exit(void *re);
    

    2.4 阻塞并回收线程

    xxx * ptr;
    int pthread_join(pthread_t thread, void **ptr);
    //ptr是一个传出参数,即要回收的线程执行函数的返回值
    pthread_join(tid,(void**)&ptr);
    

    2.5 直接杀死线程

    pthread_testcancel();
    //为函数添加取消点,不添加将无法取消
    int pthread_cancel(pthread_t thread);
    

    2.6 线程分离

    将该线程分离,不能由其他线程释放,等结束时系统自动释放

     int pthread_detach(pthread_t thread);
    

    2.7 错误检查

    strerror(int errorno)
    

    perror为检查进程中

    三、线程同步

    通过锁机制来实现,当前学习均为建议锁,不强制访问锁,可以直接访问数据

    3.1 互斥锁

    初始为1,上锁--为0,解锁释放为1

    pthread_mutex_t lock;
    //  创建锁
    int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);
    //  初始化锁
    int pthread_mutex_lock(pthread_mutex_t *mutex);
    // 加锁
    int pthread_mutex_unlock;
    //  解锁
    int pthread_mutex_destroy(pthread_mutex_t *mutex);
    //  销毁锁
    
    pthread_mutex_trylock;// 尝试锁
    

    3.2 读写锁

    • 适合读多写少的情况
    • 写独占读共享
    • 写优先级高
    • 读时不允许写
    pthread_rwlock_t  rwlock;
    int pthread_rwlock_init(pthread_rwlock_t *lock, const pthread_rwlockattr_t *attr);
    int pthread_rwlock_rdlock(pthread_rwlock_t *lock);
    int pthread_rwlock_wrlock(pthread_rwlock_t *lock);
    
    int pthread_rwlock_trywrlock(pthread_rwlock_t *lock);
    int pthread_rwlock_tryrdlock(pthread_rwlock_t *lock);
    
    int pthread_rwlock_destroy(pthread_rwlock_t *lock);
    

    3.3 条件变量

    本身不是锁,等待某个条件满足,但会结合互斥锁来使用

    pthread_cond_t cond;
    
    int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t * attr);//动态
    cond = PTHREAD_COND_INITIALIZER//静态
    //初始化
    int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
    int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t * mutex, const struct timespec *abstime);
     //等待条件
    /*
    阻塞等待cond,并释放mutex
    收到signal后,重新给mutex上锁
    
    */
    int pthread_cond_signal(pthread_cond_t *cond);
     int pthread_cond_broadcast(pthread_cond_t *cond);
    //通知等待满足
    int pthread_cond_destroy(pthread_cond_t *cond);
    
    
    
    
    



    image.png

    3.4 信号量

    相当于初始化为N的互斥量

    sem_r sem;
    sem_init(sem_t *sem, int pshared,int value);
    //pshared --0 线程同步
    //              --1 进程同步
    sem_t * sem_open(const char *name, int oflag, ...);
    
    sem_wait(sem_t *sem);
    sem_trywait(sem_t *sem);
    sem_post(sem_t *sem);
    

    相关文章

      网友评论

          本文标题:系统编程--线程

          本文链接:https://www.haomeiwen.com/subject/ootesktx.html