zoukankan      html  css  js  c++  java
  • 线程相关函数(POSIX线程):

    创建单个线程

    #include <pthread.h>

    // 若成功返回0,出错返回正的Exxx值
    int pthread_create(pthread_t *tid, // 每个线程在进程中的线程ID
                       const pthread_attr_t *attr, // 线程属性,默认为0
                       void * (*func)(void *), // 该线程执行的函数
                       void *arg); // 上述函数的参数

    等待一个给定线程终止

    #include <pthread.h>
    
    // 若成功返回0,出错返回正的Exxx值
    int pthread_join(pthread_t *tid, void **status); // status存储所等待线程的返回值
    
    // 类似于waitpid()函数

    获取线程ID

    #include <pthread.h>
    
    // 返回调用线程自身的ID,不同于pthread_create中的线程在进程中的ID
    pthread_t pthread_self(void);

    将某个线程转变为脱离状态

    一个线程是可汇合的(joinable)或者脱离的(detached)
    一个可汇合的线程终止时,它的线程ID和退出状态将保留到另一个线程对它调用pthread_join
    一个脱离的线程终止时,所有相关资源都被释放,我们无法等待它的终止
    如果我们需要知道某个线程什么时候终止,那么最好将其保持在可汇合状态

    #include <pthread.h>
    
    // 若成功返回0,出错返回正的Exxx值
    int pthread_detach(pthread_t tid);

    终止一个线程

    终止一个线程有三种方法:
    1.代用pthread_exit
    2.启动线程的函数(pthread_create的第三个参数)可以返回
    3.该线程所在进程的main函数返回或任何线程调用了exit

    #include <pthread.h>
    
    void pthread_exit(void *status);

    处理线程的特定数据

    #include <pthread.h>
    
    // 若成功返回0,出错返回正的Exxx值
    // 当一个使用线程特定数据的函数被调用时,pthread_once通常被此函数调用
    int pthread_once(pthread_once_t *onceptr, // pthread_once使用onceptr指向的变量中的值保证init只被调用一次
    void (*init)(void)); 
    
    // 若成功返回0,出错返回正的Exxx值
    // 创建某个线程特定数据 
    int pthread_key_create(pthread_key_t *keyptr, // 特定数据中被创建的键,而数据指针是值,但我们需要
    void (*destructor)(void *value)); // 用到的数据其实是该指针指向的位置的数据

    获取和存放与某个键关联的值

    #include <pthread.h>
    
    // 返回指向线程特定数据的指针,即上述的值
    void *pthread_getspecific(pthread_key_t key);
    
    
    // 若成功返回0,出错返回正的Exxx值
    int pthread_setspecific(pthread_key_t key, const void *value);

    相关内容:

    进程与线程

    互斥、同步

    互斥锁

    #include <pthread.h> 

    // 若成功返回0,出错返回正的Exxx值
    // mptr通常被初始化为PTHREAD_MUTEX_INITIALIZER
    int pthread_mutex_lock(pthread_mutex_t *mptr);
    int pthread_mutex_unlock(pthread_mutex_t *mptr);

    条件变量:

    #include <pthread.h>
    
    // 以下两个函数使用条件变量
    // 若成功返回0,出错返回正的Exxx值
    // cptr通常被初始化为PTHREAD_COND_INITIALIZE
    int pthread_cond_signal(pthread_cond_t *cptr); // cptr指条件变量的类型
    
    int pthread_cond_wait(pthread_cond_t *cptr, pthread_munex_t *mptr);

    pthread_cond_wait必须放在pthread_mutex_lock和pthread_mutex_unlock之间,因为他要
    根据共享变量的状态来觉得是否要等待,而为了不永远等待下去所以必须要在lock/unlock
    队中

    pthread_cond_signal通常唤醒等在相应条件变量上的单个进程

    #include <pthread.h>
    
    // 若成功返回0,出错返回正的Exxx值
    int pthread_cond_broadcast(pthread_cond_t *cptr); // 唤醒在相应条件变量上的所有线程
    
    int pthread_cond_timewait(pthread_cond_t *cptr, pthread_munex_t *mptr, // 允许线程设置一个阻塞时间限制
    const struct timespec *abstime); 
    // abstime指的是绝对时间,而不是一个时间增量
    // abstime通常调用gettimeofday获取当前时间,将其复制到timespec结构中,再加上期望的时间限制
  • 相关阅读:
    文件夹对比工具
    删除eval key
    Mongodb Backup and Restore
    RabbitMQ Management界面中查看NaN的队列
    css文字描边
    网页适配 iPhoneX,就是这么简单
    VSCode 配置使用less转成.min.css压缩
    css3随着外层包裹的旋转里面的图标为正
    安装nginx+免费https证书
    在线微博数据可视化
  • 原文地址:https://www.cnblogs.com/lnlin/p/9525510.html
Copyright © 2011-2022 走看看