美文网首页
2019-06-03 Linux多线程

2019-06-03 Linux多线程

作者: 知成 | 来源:发表于2019-07-03 10:24 被阅读0次

    Linux 多线程


    线程是进程中负责程序执行的执行单元,一个进程至少有一个线程。进程有自己独立的资源,线程共享进程资源。

    创建多线程函数

    #include<pthread
    int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
    
    • thread:为线程结构体,用于引用新创建的线程
    • arrt:设置线程属性一般为空
    • start_routine:线程所要执行函数的地址
    • 线程执行函数的参数
    • 返回值:创建成功返回0,创建失败返回错误代码

    注意:编译多线程时,需要添加“-lpthread”.

    获得线程ID

    //获得线程tid
    pthread_self();
    //获得线程tpid;
    syscall(SYS_gettid)
    

    等待线程

    int pthread_join(pthread_t thread,void **value_ptr);
    
    • thread:线程ID
    • value_ptr:后者指向线程的返回值。

    函数pthread_setcancelstate设置线程可取消状态

    int pthread_setcancelstate(int state, int *oldstate);
    

    属性选择
    PTHREAD_CANCEL_ENABLE 可取消属性
    PTHREAD_CANCEL_DISABLE 不可取消属性

    线程私有数据设置

    //创建与删除
    int pthread_key_create(pthread_key_t *key, void (*destructor)(void*));
    int pthread_key_delete(pthread_key_t key);
    //读写
     void *pthread_getspecific(pthread_key_t key);
    int pthread_setspecific(pthread_key_t key, const void *value);
    

    线程执行后的清理函数

    #include <pthread.h>
    void pthread_cleanup_push(void (*rtn)(void *),void *arg);
    void pthread_cleanup_pop(int execute);
    

    线程清理处理程序
    pthread_cleanup_push来注册清理函数rtn,这个函数有一个参数arg。在以下三种情形之一发生时,注册的清理函数被执行:
      1)调用pthread_exit。
      2)作为对取消线程请求(pthread_cancel)的响应。
      3)以非0参数调用pthread_cleanup_pop。
    注意:
    1)如果线程只是由于简单的返回而终止的,则清除函数不会被调用。
    2)如果pthread_cleanup_pop被传递0参数,则清除函数不会被调用,但是会清除处于栈顶的清理函数。

    线程取消函数pthread_cancel

    int pthread_cancel(pthread_t thread);
    

    pthread_cancel调用并不等待线程终止,它只提出请求。线程在取消请求(pthread_cancel)发出后会继续运行,
    直到到达某个取消点(CancellationPoint)。取消点是线程检查是否被取消并按照请求进行动作的一个位置.

    线程的互斥

    对互斥的理解,当两个或多个线程,要对公共资源进行操作时,锁定正在操作的线程避免同时对公共资源进行操作。

    pthread_mutex_t mutex_lock;     //定义锁
    pthread_mutex_init(&mutex_lock,NULL);       //初始化锁
    pthread_mutex_lock(&mutex_lock);        //枷锁操作
    pthread_mutex_unlock(&mutex_lock);      //操作完后解锁
    

    条件变量

    int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);     
    int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
    int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);
    int pthread_cond_destroy(pthread_cond_t *cond);  
    int pthread_cond_signal(pthread_cond_t *cond);
    int pthread_cond_broadcast(pthread_cond_t *cond);  //解除所有线程的阻塞
    

    int pthread_cond_init

    cond是一个指向结构pthread_cond_t的指针,cond_attr是一个指向结构pthread_condattr_t的指 针。结构 pthread_condattr_t是条件变量的属性结构,和互斥锁一样我们可以用它来设置条件变量是进程内可用还是进程间可用,默认值是PTHREAD_PROCESS_PRIVATE,即此条件变量被同一进程内的各个线程使用。

    pthread_cond_destroy

    释放一个条件变量

    pthread_cond_signal和函数 pthread_cond_broadcast

    pthread_cond_signal和函数pthread_cond_broadcast唤醒线程,被唤醒后它将重新检查判断条件是否满足,如果还不满足,一般说来线程应该仍阻塞在这里,被等待被 下一次唤醒。

    pthread_cond_wait和函数pthread_cond_timewait

    等待信号量的,若收到信号则执行对应程序,pthread_cond_timewait函数与pthread_cond_wait相比较多了超时操作。

    gdb下调试多线程常用命令

    & info threadsankan 查看当前进程中的线程
    & thread <ID> 切换线程
    & set scheduler-locking off|on|step
    当设置为off时不锁定任何线程
    当设置on时当前调试线程执行
    当设置为step时单步执行

    相关文章

      网友评论

          本文标题:2019-06-03 Linux多线程

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