一、概述
在《线程编程常见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
相关推荐
本篇将深入探讨多线程编程模型,包括相关概念、操作系统提供的API以及在实际编程中遇到的问题和解决方案。 首先,我们要理解多线程中涉及的各种对象的概念。线程是执行路径或程序执行的顺序流,它是进程中的一个...
接着,书中详细讲解了C++中用于多线程编程的API,如CreateThread、_beginthreadex等,以及如何使用C++11及更新的标准库中的std::thread。这些API的使用方法和注意事项是多线程编程实践中的重要知识,书中会有具体的...
其次,线程同步是多线程编程中的关键部分,以防止数据竞争和不一致。Java提供了多种同步机制,如synchronized关键字、Lock接口(如ReentrantLock)以及volatile关键字。synchronized用于控制对共享资源的访问,确保...
在Linux多线程编程手册中,除了对各种API进行详细说明外,也会对常见的编程模式和设计原则进行指导,例如如何处理线程同步问题、死锁避免、线程池的使用等。此外,手册可能还会讨论特定于平台的特性,例如在Linux上...
读者还将了解到如何处理多线程环境中的死锁、饥饿和活锁等问题,这些都是多线程编程中常见的挑战。 总的来说,《多线程编程指南》是一本全面介绍多线程编程的参考书籍,适合于有经验的软件开发者和初学者,旨在帮助...
多线程编程是一种让多个代码路径在同一个程序中同时运行的技术,它允许多个执行流(线程)并发执行。在iOS开发中,多线程编程可以帮助开发者充分利用多核处理器的性能,提高应用程序的响应性和运行效率。然而,多...
MFC通过提供CWinThread类来支持多线程编程,它封装了Windows API的线程创建和管理功能。 创建MFC多线程主要涉及以下几个步骤: 1. **继承CWinThread**:首先,你需要创建一个新的C++类,并让它继承自CWinThread。...
压缩包中的"threadtech_jb51.rar"可能包含具体的多线程编程示例,如并发下载、并行计算、用户界面更新等常见应用场景。这些实例可以帮助理解如何在实际项目中有效地使用多线程。 总结,掌握VC++多线程编程不仅需要...
在计算机科学领域,多线程编程是一种常见的技术手段,用于提高程序的执行效率和响应能力。通过本篇文章,我们将探讨多线程编程的基本概念及其在实际开发中的应用。 #### 二、问题背景与解决方案 假设我们正在开发一...
#### 四、多线程编程常见问题及解决策略 在实际开发过程中,可能会遇到以下几种常见问题: 1. **竞态条件**:当两个或多个线程同时访问相同的共享资源时,可能会导致数据不一致的问题。解决方法通常是使用互斥锁或...
多线程编程是现代操作系统中的一个重要概念,尤其在Linux这样的高性能、多任务操作系统中尤为重要。Linux下的多线程编程主要遵循POSIX线程接口标准,通常称为pthread。本文将详细介绍Linux下的多线程编程原理、基本...
在现代软件开发中,多线程编程是一种常见的技术,它能够充分利用计算机系统的多核处理能力,提高应用程序的执行效率。然而,多线程编程也带来了一系列复杂的问题,其中最典型的就是同步互斥问题。如果多个线程试图...
"实验一:WindowsThreads多线程编程实验"旨在让学生深入理解和实践如何在Windows系统中创建和管理线程。通过这个实验,我们可以学习到以下几个关键知识点: 1. **线程的概念**:线程是操作系统分配CPU时间的基本...
总之,《深入浅出Win32多线程编程》这本书将引导读者深入了解Win32 API中的多线程编程技术,通过实例讲解如何创建、同步和管理线程,以及如何解决多线程编程中遇到的各种问题。无论是初学者还是经验丰富的开发者,都...
死锁是多线程编程中常见的问题,当两个或更多线程相互等待对方释放资源时就会发生死锁。避免死锁的方法包括避免循环等待、设置超时、资源预分配等。此外,活锁也是需要注意的问题,即线程不断重试导致永远无法进行...
《C#多线程编程第二版[2016]》是关于C#语言中多线程编程技术的一本实用指南。本书详细介绍了如何在C#环境下实现多线程编程的各种技术,包括创建线程、线程同步、线程池的使用等内容。它为开发者提供了大量的“食谱”...
死锁是多线程编程中的一种常见问题,发生在两个或更多线程相互等待对方释放资源,从而导致所有线程都无法继续的情况。避免死锁的方法包括避免循环等待、设置超时、使用死锁检测算法等。 线程优先级也是Java多线程中...
在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)中的多线程编程,结合提供的标题“MFC多线程编程实例三个”以及描述中的信息,我们将会了解到如何在MFC应用中实现多线程,特别是在Tab控件中创建多个带...