zoukankan      html  css  js  c++  java
  • 向你的C语言项目中加入多线程

    C语言在标准库<pthread.h>中为程序员提供了多线程操作接口。

    先从简单操作入手

    int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine) (void *arg), void *arg) 线程创建
    int pthread_join( pthread_t thread, void * * value_ptr ) 线程等待
    int pthread_detach(pthread_t thread) 线程分离
    int pthread_exit(pthread_t th, void **thr_return) 线程结束

    pthread_t

    pthread_t是表示线程号的数据类型。它的出处是/usr/include/bits/pthreadtypes.h

    typedef unsigned long int pthread_t
    

    pthread_create

    线程创建函数,为新线程分配资源并且创建成功后线程即开始运行,新线程的线程号即传参进去的线程号。

    通过第二个参数指定新线程的属性为“joinable”或“detached”,默认为joinable。若线程属性为joinable,则需要由其他线程调用pthread_join阻塞等待其结束并为之回收资源,不然就成了"僵尸线程";若线程属性为detached,则线程结束后自动回收所有资源。

    • 参数说明
    int pthread_create(pthread_t *thread,   目标线程的线程号
                        pthread_attr_t *attr,  设置线程的属性
                        void *(*start_routine) (void *arg), 目标函数的起始地址
                        void *arg) 目标函数的参数 
    
    • 返回值
      如果线程创建成功,返回0; 如果线程创建失败,返回错误编号。

    pthread_join

    当调用pthread_join时,当前线程进入阻塞状态,等待被连接的线程运行结束返回,当前线程再转回运行状态。被连接的线程必须是非分离的。一个线程不能被多个线程等待。

    • 参数说明
    int pthread_join( pthread_t  thread,      目标线程的线程号 
                      void * * value_ptr )      目标线程的返回值
    
    • 返回值
      成功则返回0; 失败则返回错误编号。

    pthread_detach

    将joinable的线程设置为detached的线程。这样该线程在运行结束后会自动回收其所有资源。

    pthread_exit

    调用pthread_exit可以显式地结束当前线程,传入的唯一的参数是线程的返回值。

    掌握基本操作后开始学习新技能

    互斥锁

    //两种方法对锁进行初始化
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    int pthread_mutex_init(pthread_mutex_t *restrict mutex,
                  const pthread_mutexattr_t *restrict attr);
    //互斥锁的销毁
    int pthread_mutex_destroy(pthread_mutex_t *mutex);
    
    //获得锁
    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_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); 
    



  • 相关阅读:
    改造vant日期选择
    css3元素垂直居中
    npm综合
    (转)网页加水印方法
    Mac下IDEA自带MAVEN插件的全局环境配置
    隐藏注册控件窗口
    High performance optimization and acceleration for randomWalk, deepwalk, node2vec (Python)
    How to add conda env into jupyter notebook installed by pip
    The Power of WordNet and How to Use It in Python
    背单词app测评,2018年
  • 原文地址:https://www.cnblogs.com/dynmi/p/13679354.html
Copyright © 2011-2022 走看看