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



向你的C语言项目中加入多线程的更多相关文章

  1. Go语言项目中使用zap日志库(翻译)

    本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项目中使用Uber-go的Zap L ...

  2. C 语言项目中.h文件和.c文件的关系

    http://blog.csdn.net/xingkong_678/article/details/38639847 关于两者以前的关系,要从N年以前说起了~ long long ago,once a ...

  3. Go语言项目的错误和异常管理 via 达达

    Go语言项目的错误和异常管理 最近连续遇到朋友问我项目里错误和异常管理的事情,之前也多次跟团队强调过错误和异常管理的一些概念,所以趁今天有动力就赶紧写一篇Go语言项目错误和异常管理的经验分享. 首先我 ...

  4. TIA Portal V13 WinCC中创建多语言项目

    1. 在项目树下选择“语言和资源”,双击打开“项目语言”,设置编辑语言和参考语言. 2. 在项目语言栏中勾选项目所需要的多种语言,我们以选择德语.英语和中文为例 3. 点击“参考语言”,切换语言为英语 ...

  5. 在Windows Phone项目中调用C语言DLL

    在Windows Phone项目中调用C语言写的DLL 最近接到一个需求,需要在WP里调用一个C语言写的DLL,并且说Android和iOS都可以,问我WP是否可以这样? 我说我调研一下,就有了下面的 ...

  6. vue-i18n vue-cli项目中实现国际化 多语言切换功能 一

    vue-cli项目中引入vue-i18n 安装: npm install vue-i18n可参考vue-i18n官网文档 main.js中引入: import Vue from 'vue' impor ...

  7. Go1.13 标准库的 http 包爆出重大 bug,你的项目中招了吗? 原创: 王亚楼 Go语言中文网 今天

    Go1.13 标准库的 http 包爆出重大 bug,你的项目中招了吗? 原创: 王亚楼 Go语言中文网 今天

  8. (42)嵌入式项目中常用到的C语言技能总结

    嵌入式项目中常用到的C语言技能 1.指针 .结构体. 枚举. 联合.数组.字符串.链表七个专题 2.结构体指针.结构体的多重嵌套[结构体中嵌套结构体.结构体中嵌套枚举.联合体.结构体中嵌套函数指针.一 ...

  9. 在项目中同时使用Objective-C和Swift

    苹果发布的Swift语言可以和之前的Objective-C语言同时存在于一个项目中. 可能有人会认为是同一个类文件中既可以有Objective-C也可以有Swift,这是不对的.同一个类文件或同一个代 ...

  10. Atitit.java c#.net php项目中的view复用(jsp,aspx,php的复用)

    Atitit.java c#.net php项目中的view复用(jsp,aspx,php的复用) 1.1. Keyword1 1.2. 前言1 2. Java项目使用.Net的aspx页面view1 ...

随机推荐

  1. [C#] 将 List 转 DataTable

    /// <summary> /// Convert a List{T} to a DataTable. /// </summary> private DataTable ToD ...

  2. javascript运行模式:并发模型 与Event Loop

    看了阮一峰老师的JavaScript 运行机制详解:再谈Event Loop和[朴灵评注]的文章,查阅网上相关资料,把自己对javascript运行模式和EVENT loop的理解整理下,不一定对,日 ...

  3. java中自动装箱的问题

    package wrapper; public class WrapperDemo { public static void main(String[] args) { Integer a=new I ...

  4. 问答精华-IntelliJ IDEA快捷键大全

    这篇文章介绍了idea的默认快捷键http://www.jikexueyuan.com/blog/229.html 另外:老师将快捷键设置为eclipse的了,你需要在preference里面找到ke ...

  5. ThinkPHP目录结构

    ThinkPHP框架目录结构 文件路径 文件描述 \index.php 入口文件 \Application 应用目录 \Public 资源文件目录 \ThinkPHP 框架核心目录   \Applic ...

  6. 【luogu P4005 清华集训2017】小Y和地铁

    题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...

  7. jmeter 压力测试(二) 获取不同格式的当前时间

    在jmeter中获取当前时间可以用“time”函数,可以设置不同的格式,如下为几个最常见的例子: 输出看一下: 如此,基本满足了日常的需求,令可以根据自己的时间需求,设置格式.

  8. IOS中position:fixed弹出框中的input出现光标错位的问题

    解决方案是 在弹框出现的时候给body添加fixed <style type="text/css"> body{ position: fixed; width: 100 ...

  9. position:fixed ,锚点定位不准确的问题

    解决方案: 参照 stackoverflow 的做法,在主体内容前加一个暗锚 <div class="anmao" id="experts">< ...

  10. CLIENT_0004:Unable to find valid Kerberos ticket cache (kinit)

    背景 今天在使用JavaAPI来连接sqoop1.99.7的时候,遇到了个错误. 错误信息如下: 0 [main] WARN org.apache.hadoop.util.NativeCodeLoad ...