一、概述
在《线程编程常见API简介(上) 》中讲述了有关线程创建过程中常用的 API 的使用方法,本节继续讲述有关线程编程中常用 API 的使用方法。主要说明有关线程锁、线程局部变量等 API 的使用。
二、常用 API
1)线程锁 API
1.1)线程锁的初始化及销毁:pthread_mutex_init/pthread_mutex_destroy;在 acl 库中对应的 API 为:acl_pthread_mutex_init/acl_pthread_mutex_destroy。
/** * 初始化线程锁对象 * @param mutex {pthread_mutex_t*} 线程锁对象 * @param attr {const pthread_mutexattr_t*} 线程锁属性对象 * @return {int} 返回 0 表示成功,否则表示出错 */ int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); /** * 销毁线程锁资源 * @param mutex {pthread_mutex_t*} 线程锁对象,之前必须成功调用了 * pthread_mutex_init 初始化了线程锁对象 * @return {int} 返回 0 表示成功,否则表示出错 */ int pthread_mutex_destroy(pthread_mutex_t *mutex);
在线程初始化 API 中有一个线程锁属性对象:pthread_mutexattr_t *attr,该对象需要调用如下函数进行初始化及销毁:
1.2)线程锁属性对象的初始化及销毁:pthread_mutexattr_init/pthread_mutexattr_destroy。
/** * 初始化线程锁属性对象 * @param attr {pthread_mutexattr_t*} 线程锁属性对象 * @return {int} 返回 0 表示成功,否则表示出错 */ int pthread_mutexattr_init(pthread_mutexattr_t *attr); /** * 销毁在初始化线程锁属性对象时分配的内部资源 * @param attr {pthread_mutexattr_t*} 线程锁属性对象 * @return {int} 返回 0 表示成功,否则表示出错 */ int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
除了上面所列出的初始化线程锁的方法外,在LINUX下台下还有一个快速对线程锁进行初始化的方法,如下声明线程锁变量即可:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
1.3)线程锁加锁解锁 API:pthread_mutex_lock/pthread_mutex_unlock;在 acl 库中相应的表现形式为:acl_pthread_mutex_lock/acl_pthread_mutex_unlock。
/** * 对线程锁加锁,一直至成功加锁或出错为止 * @param mutex {pthread_mutex_t*} 线程锁对象 * @return {int} 返回 0 表示成功加锁,否则表示出错 */ int pthread_mutex_lock(pthread_mutex_t *mutex); /** * 对加锁的线程锁解锁 * @param mutex {pthread_mutex_t*} 线程锁对象 * @return {int} 返回 0 表示成功解锁,否则表示出错,出错原因一般为: * 线程锁对象无效或当前该解锁线程并未拥有该线程锁 */ int pthread_mutex_unlock(pthread_mutex_t *mutex);
除了上面提到的阻塞式加锁方法,还有一个非阻塞式的加锁方法,调用 pthread_mutex_trylock API:
/** * 尝试对线程锁加锁,如果该锁未被其它线程拥有,则本加锁线程便加锁 * 成功,否则立即返回,并返回 EBUSY 表示该线程锁正被其它线程拥有 * @param mutex {pthread_mutex_t*} 线程锁对象 * @return {int} 返回 0 表示成功加锁,否则返回未成功加锁原因,一般 * 原因有:线程锁对象无效,或该锁正被其它线程加锁 */ int pthread_mutex_trylock(pthread_mutex_t *mutex);
需要区分 pthread_mutex_lock 和 pthread_mutex_trylock 两种不同加锁方法,前者在成功加锁前会一直阻塞到其它线程释放锁(或出错了),后者则会立即返回,根据其返回值来检查是否成功加锁。
2)线程锁示例
下面以一个例子来简要说明一下上面线程锁的一些 API 的使用方法:
#include <pthread.h> #include <assert.h> /* 全局静态线程锁 */ static pthread_mutex_t __mutex; /* 全局静态变量 */ static int __count = 0; static void *thread_fn(void *arg) { (void) arg; /* 避免编译器警告 */ /* 对线程锁加锁 */ assert(pthread_mutex_lock(&__mutex) == 0); __count++; /* 对全局静态变量加 1 */ /* 对线程锁解锁 */ assert(pthread_mutex_unlock(&__mutex) == 0); return NULL; } int main(void) { int i; pthread_t tids[10]; /* 使用缺省的属性初始化线程锁 */ assert(pthread_mutex_init(&__mutex, NULL) == 0); /* 创建 10 个子线程 */ for (i = 0; i < 10; i++) assert(pthread_create(&tids[i], NULL, thread_fn, NULL) == 0); /* 等待所有子线程结束 */ for (i = 0; i < 10; i++) assert(pthread_join(&tids[i], NULL) == 0); /* 判断全局静态变量最后的结果应该为 10 */ assert(__count == 10); /* 销毁线程锁 */ assert(pthread_mutex_destroy(&__mutex) == 0); return 0; }
3) 线程局部变量
有关线程局部变量的含义、API以及使用示例,请参考另外两篇文章:《多线程开发时线程局部变量的使用》,《再谈线程局部变量》。
好了,先说这些吧,下一节继续描述有关线程条件变量相关的 API 使用说明。
本文地址:http://zsxxsz.iteye.com/blog/1567814
acl 库下载:https://sourceforge.net/projects/acl/
github: https://github.com/acl-dev/acl
相关推荐
2 基本线程编程.............................................................................................................................................23 线程库.......................................
2 基本线程编程23 线程库................................................................................................................................................. 23 创建缺省线程...................
用线程编程是技巧性很强的且不可移植。 而在Java中却完全不同。Java的线程工具易于使用,并且像Java中的其他东西一样可以在不同的平台之间移植。这是一件好事,因为如果没有线程,那么除了最简单的applet之外,几乎...
常见的多线程API和用法 pthread_self函数 pthread_create函数 pthread_exit函数 pthread_join函数 pthread_detach函数 pthread_equal函数
第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCPServer和AsynclnputStream 总结 第六章 Java线程调度 线程调度概述 何时调度是重要的 调度和线程优先级 ...
Java API:常见对象 更新中 Java API:常见对象-阶段性测试 更新中 Java API:集合框架 更新中 IO/输入输出 更新中 IO/输入输出-阶段性测试 更新中 多线程 更新中 图形用户界面编程GUI 更新中 网络编程 更新中 反射-...
数据库应用程序编程接口(DB-API) 17.1. 知识点 17.2. 良好的编程习惯 17.3. 常见编程错误 17.4. 移植性提示 18. 进程管理 18.1. 知识点 18.2. 良好的编程习惯 18.3. 移植性提示 19. 多线程处理 19.1. ...
ch05 多线程编程 ch06 I/O及网络编程 ch07 数据库RMS编程 ch08 浮点数编程 ch09 多媒体及GAME API编程 ch10 安全、加密及代码优化 ch11 扩展类库及供应商提供的API ch12 与服务端联合搭建移动应用 ch13 XML ...
│ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable中的应用分析.mp4 │ 高并发编程第一阶段08讲、构造Thread对象你...
资源内包含java常见的技术帮助文档。java编程规范、线程使用、集合框架等等。很适合初学者以及拓展资料
4. 并发与多线程编程 技巧10:线程同步与并发控制 技巧11:避免死锁的策略与设计模式 技巧12:线程安全编程与锁机制的正确使用 5. .NET框架高级特性 技巧13:LINQ查询表达式的高效运用 技巧14:Lambda表达式与委托...
此外,书中还深入剖析了并发编程中的常见问题,如死锁、活锁、饥饿等,并提供了相应的解决方案和最佳实践。 本书注重理论与实践相结合,通过大量的示例代码和案例分析,帮助读者更好地理解和掌握并发编程的技巧和...
│ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable中的应用分析.mp4 │ 高并发编程第一阶段08讲、构造Thread对象你...
什么是Java中的Stream API?它的作用和使用场景是什么? Java中的GC(垃圾回收)是什么?如何手动触发对象的垃圾回收? 什么是Java中的设计模式?列举一些常见的设计模式。 什么是Java中的单例模式?如何实现线程...
在讲解多线程、常用API、集合、IO、GUI、网络编程的章节中,通过剖析案例、分析代码含义、解决常见问题等方式进行阐述,并且在本书中还添加了许多 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
面向对象的编程思想、Java语言的基础知识、异常处理、类与对象的生命周期、多线程、Java集合、泛型、Annotation标注、输入/输出和GUI编程,以及JDK8引入的如虎添翼的新特征,比如支持函数式编程的Lambda表达式和功能...
在多线程、常用API、集合、IO、GUI、网络编程章节中,通过剖析案例、分析代码结构含义、解决常见问题等方式,帮助初学者培养良好的编程习惯。最后,讲解了Eclipse开发工具,帮助初学者熟悉开发工具的使用。
- 多线程编程 2. 数据库: - 熟悉SQL语言 - 了解关系型数据库和非关系型数据库 - 数据库连接池 - 数据库事务 3. Spring框架: - Spring Boot - Spring MVC - Spring Data - Spring Security - Spring...
虽然有许多很好的联机资源详细说明了线程 API,但本文尝试提供一些实际的示例,以说明一些常见的线程使用模式。 全局解释器锁 (Global Interpretor Lock) 说明 Python 解释器并不是线程安全的。当前线程