• 向你的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); 
    



  • 相关阅读:
    程序员之歌 littleflute原创
    生成网站缩略图的小工具,:)
    十个习惯
    用反编译工具透析.Net页面生成本质
    装箱拆箱陷阱揭秘
    图片上传——用一般处理程序实现
    Web.config文件中常用的配置节点
    初识三层,请多指教
    匪夷所思的题目,心理慢慢引导
    权重分配方法
  • 原文地址:https://www.cnblogs.com/dynmi/p/13679354.html
Copyright © 2020-2023  润新知