`
zsxxsz
  • 浏览: 444078 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

线程编程常见API简介(中)

阅读更多

 

一、概述

      在《线程编程常见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://weibo.com/zsxxsz

本文地址:http://zsxxsz.iteye.com/blog/1567814

acl 库下载:https://sourceforge.net/projects/acl/

github: https://github.com/acl-dev/acl

 

0
0
分享到:
评论

相关推荐

    多线程编程指南PDF

    2 基本线程编程.............................................................................................................................................23 线程库.......................................

    多线程编程指南(系统描述了线程标准 线程同步 多线程编程原则 等)

    2 基本线程编程23 线程库................................................................................................................................................. 23 创建缺省线程...................

    线程 JAVA java线程 java线程第3版 java线程第2版第3版合集

    用线程编程是技巧性很强的且不可移植。 而在Java中却完全不同。Java的线程工具易于使用,并且像Java中的其他东西一样可以在不同的平台之间移植。这是一件好事,因为如果没有线程,那么除了最简单的applet之外,几乎...

    多线程API.zip

    常见的多线程API和用法 pthread_self函数 pthread_create函数 pthread_exit函数 pthread_join函数 pthread_detach函数 pthread_equal函数

    java 多线程设计模式 进程详解

    第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCPServer和AsynclnputStream 总结 第六章 Java线程调度 线程调度概述 何时调度是重要的 调度和线程优先级 ...

    java基础知识

    Java API:常见对象 更新中 Java API:常见对象-阶段性测试 更新中 Java API:集合框架 更新中 IO/输入输出 更新中 IO/输入输出-阶段性测试 更新中 多线程 更新中 图形用户界面编程GUI 更新中 网络编程 更新中 反射-...

    《Python编程金典》读书笔记

    数据库应用程序编程接口(DB-API) 17.1. 知识点 17.2. 良好的编程习惯 17.3. 常见编程错误 17.4. 移植性提示 18. 进程管理 18.1. 知识点 18.2. 良好的编程习惯 18.3. 移植性提示 19. 多线程处理 19.1. ...

    javac#开发手机程序及移动应用

    ch05 多线程编程 ch06 I/O及网络编程 ch07 数据库RMS编程 ch08 浮点数编程 ch09 多媒体及GAME API编程 ch10 安全、加密及代码优化 ch11 扩展类库及供应商提供的API ch12 与服务端联合搭建移动应用 ch13 XML ...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable中的应用分析.mp4 │ 高并发编程第一阶段08讲、构造Thread对象你...

    Java相关技术api

    资源内包含java常见的技术帮助文档。java编程规范、线程使用、集合框架等等。很适合初学者以及拓展资料

    C#开发常见问题清单总结与入门常见问题.docx

    4. 并发与多线程编程 技巧10:线程同步与并发控制 技巧11:避免死锁的策略与设计模式 技巧12:线程安全编程与锁机制的正确使用 5. .NET框架高级特性 技巧13:LINQ查询表达式的高效运用 技巧14:Lambda表达式与委托...

    JAVA高质量并发详解,多线程并发深入讲解

    此外,书中还深入剖析了并发编程中的常见问题,如死锁、活锁、饥饿等,并提供了相应的解决方案和最佳实践。 本书注重理论与实践相结合,通过大量的示例代码和案例分析,帮助读者更好地理解和掌握并发编程的技巧和...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable中的应用分析.mp4 │ 高并发编程第一阶段08讲、构造Thread对象你...

    java经典面试题目-面经-java-Java语言的进阶概念-常用的库和框架-并发编程-网络编程-Web开发-面经

    什么是Java中的Stream API?它的作用和使用场景是什么? Java中的GC(垃圾回收)是什么?如何手动触发对象的垃圾回收? 什么是Java中的设计模式?列举一些常见的设计模式。 什么是Java中的单例模式?如何实现线程...

    JAVA基础案例教程

    在讲解多线程、常用API、集合、IO、GUI、网络编程的章节中,通过剖析案例、分析代码含义、解决常见问题等方式进行阐述,并且在本书中还添加了许多 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。

    孙卫琴java面向对象编程(答案及源码)

    面向对象的编程思想、Java语言的基础知识、异常处理、类与对象的生命周期、多线程、Java集合、泛型、Annotation标注、输入/输出和GUI编程,以及JDK8引入的如虎添翼的新特征,比如支持函数式编程的Lambda表达式和功能...

    java基础总结

    在多线程、常用API、集合、IO、GUI、网络编程章节中,通过剖析案例、分析代码结构含义、解决常见问题等方式,帮助初学者培养良好的编程习惯。最后,讲解了Eclipse开发工具,帮助初学者熟悉开发工具的使用。

    202304-并发编程面试题(2023最新版)思维导图.zip

    - 多线程编程 2. 数据库: - 熟悉SQL语言 - 了解关系型数据库和非关系型数据库 - 数据库连接池 - 数据库事务 3. Spring框架: - Spring Boot - Spring MVC - Spring Data - Spring Security - Spring...

    使用Python中的线程进行网络编程的入门教程

    虽然有许多很好的联机资源详细说明了线程 API,但本文尝试提供一些实际的示例,以说明一些常见的线程使用模式。 全局解释器锁 (Global Interpretor Lock) 说明 Python 解释器并不是线程安全的。当前线程

Global site tag (gtag.js) - Google Analytics