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);



最新文章

  1. markdown博文测试
  2. java.util.concurrent包详细分析--转
  3. WPF Prism
  4. eclipse中如何关闭运行时自动保存?
  5. 用Wireshark简单分析HTTP通信
  6. [shell]. 点的含义
  7. PLSQL_性能优化系列07_Oracle Parse Bind Variables解析绑定变量
  8. MapReduce 中的Map后,sort不能对中文的key排序
  9. php用户验证代码的简单例子
  10. 【Android】应用启动画面
  11. 最近新版本的pangolin出现了点问题,我把可用的旧版本上传到了github
  12. java基础(一):谈谈java内存管理与垃圾回收机制
  13. Node.js知识点总结
  14. U68464 滑稽树上滑稽果(guo)
  15. Math.round(),Math.ceil(),Math.floor()
  16. Swagger2 配置
  17. websocket activemq
  18. P1174 互素
  19. [linux] /sbin/nologin的用户运行程序
  20. Java遍历Map键、值。获取Map大小的方法

热门文章

  1. Elasticsearch第五篇:PlainElastic.Net 操作 Elasticsearch
  2. windows 下 安装 RabbitMQ
  3. Android ActivityResumeTrigger: not whiteListed
  4. Android 在代码中修改TextView的DrawableRight等方向上的图片
  5. unity探索者之微信分享所有流程,非第三方插件
  6. magento 2 cronjob setup
  7. java程序CPU 100%调试
  8. HDU 6609 离散化+权值线段树
  9. await,async 我要把它翻个底朝天,这回你总该明白了吧
  10. Javascript逻辑运算认识