`
zsxxsz
  • 浏览: 451111 次
  • 性别: 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
分享到:
评论

相关推荐

    多线程编程模型API

    本篇将深入探讨多线程编程模型,包括相关概念、操作系统提供的API以及在实际编程中遇到的问题和解决方案。 首先,我们要理解多线程中涉及的各种对象的概念。线程是执行路径或程序执行的顺序流,它是进程中的一个...

    Windows多线程编程技术与实例(C++)(PDF)

    接着,书中详细讲解了C++中用于多线程编程的API,如CreateThread、_beginthreadex等,以及如何使用C++11及更新的标准库中的std::thread。这些API的使用方法和注意事项是多线程编程实践中的重要知识,书中会有具体的...

    JAVA多线程编程技术PDF

    其次,线程同步是多线程编程中的关键部分,以防止数据竞争和不一致。Java提供了多种同步机制,如synchronized关键字、Lock接口(如ReentrantLock)以及volatile关键字。synchronized用于控制对共享资源的访问,确保...

    Linux多线程编程手册

    在Linux多线程编程手册中,除了对各种API进行详细说明外,也会对常见的编程模式和设计原则进行指导,例如如何处理线程同步问题、死锁避免、线程池的使用等。此外,手册可能还会讨论特定于平台的特性,例如在Linux上...

    多线程编程指南

    多线程编程是一种让多个代码路径在同一个程序中同时运行的技术,它允许多个执行流(线程)并发执行。在iOS开发中,多线程编程可以帮助开发者充分利用多核处理器的性能,提高应用程序的响应性和运行效率。然而,多...

    关于MFC多线程编程的基本介绍

    MFC通过提供CWinThread类来支持多线程编程,它封装了Windows API的线程创建和管理功能。 创建MFC多线程主要涉及以下几个步骤: 1. **继承CWinThread**:首先,你需要创建一个新的C++类,并让它继承自CWinThread。...

    VC++多线程编程 实例及讲解

    压缩包中的"threadtech_jb51.rar"可能包含具体的多线程编程示例,如并发下载、并行计算、用户界面更新等常见应用场景。这些实例可以帮助理解如何在实际项目中有效地使用多线程。 总结,掌握VC++多线程编程不仅需要...

    多线程编程10例

    在计算机科学领域,多线程编程是一种常见的技术手段,用于提高程序的执行效率和响应能力。通过本篇文章,我们将探讨多线程编程的基本概念及其在实际开发中的应用。 #### 二、问题背景与解决方案 假设我们正在开发一...

    Windows多线程编程

    #### 四、多线程编程常见问题及解决策略 在实际开发过程中,可能会遇到以下几种常见问题: 1. **竞态条件**:当两个或多个线程同时访问相同的共享资源时,可能会导致数据不一致的问题。解决方法通常是使用互斥锁或...

    linux下的多线程编程.pdf

    多线程编程是现代操作系统中的一个重要概念,尤其在Linux这样的高性能、多任务操作系统中尤为重要。Linux下的多线程编程主要遵循POSIX线程接口标准,通常称为pthread。本文将详细介绍Linux下的多线程编程原理、基本...

    解决多线程编程中的同步互斥问题

    在现代软件开发中,多线程编程是一种常见的技术,它能够充分利用计算机系统的多核处理能力,提高应用程序的执行效率。然而,多线程编程也带来了一系列复杂的问题,其中最典型的就是同步互斥问题。如果多个线程试图...

    实验一 :WindowsThreads多线程编程实验

    "实验一:WindowsThreads多线程编程实验"旨在让学生深入理解和实践如何在Windows系统中创建和管理线程。通过这个实验,我们可以学习到以下几个关键知识点: 1. **线程的概念**:线程是操作系统分配CPU时间的基本...

    深入浅出Win32多线程编程

    总之,《深入浅出Win32多线程编程》这本书将引导读者深入了解Win32 API中的多线程编程技术,通过实例讲解如何创建、同步和管理线程,以及如何解决多线程编程中遇到的各种问题。无论是初学者还是经验丰富的开发者,都...

    Java多线程编程实例

    死锁是多线程编程中常见的问题,当两个或更多线程相互等待对方释放资源时就会发生死锁。避免死锁的方法包括避免循环等待、设置超时、资源预分配等。此外,活锁也是需要注意的问题,即线程不断重试导致永远无法进行...

    c#多线程编程第二版[2016]

    《C#多线程编程第二版[2016]》是关于C#语言中多线程编程技术的一本实用指南。本书详细介绍了如何在C#环境下实现多线程编程的各种技术,包括创建线程、线程同步、线程池的使用等内容。它为开发者提供了大量的“食谱”...

    java多线程编程(第二版)

    死锁是多线程编程中的一种常见问题,发生在两个或更多线程相互等待对方释放资源,从而导致所有线程都无法继续的情况。避免死锁的方法包括避免循环等待、设置超时、使用死锁检测算法等。 线程优先级也是Java多线程中...

    MFC多线程编程实例三个

    在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)中的多线程编程,结合提供的标题“MFC多线程编程实例三个”以及描述中的信息,我们将会了解到如何在MFC应用中实现多线程,特别是在Tab控件中创建多个带...

Global site tag (gtag.js) - Google Analytics