线程相关操作
一 pthread_t
pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:
typedef unsigned long int pthread_t;
它是一个线程的标识符。
二 pthread_create
函数pthread_create用来创建一个线程,它的原型为:
extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,
void *(*__start_routine) (void *), void *__arg));
第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。对线程属性的设定和修改我们将在下一节阐述。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。
三 pthread_join pthread_exit
函数pthread_join用来等待一个线程的结束。函数原型为:
extern int pthread_join __P ((pthread_t __th, void **__thread_return));
第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。它的函数原型为:
extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));
唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给 thread_return。最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码ESRCH。
在这一节里,我们编写了一个最简单的线程,并掌握了最常用的三个函数pthread_create,pthread_join和pthread_exit。下面,我们来了解线程的一些常用属性以及如何设置这些属性。
互斥锁相关
互斥锁用来保证一段时间内只有一个线程在执行一段代码。
一 pthread_mutex_init
函数pthread_mutex_init用来生成一个互斥锁。NULL参数表明使用默认属性。如果需要声明特定属性的互斥锁,须调用函数 pthread_mutexattr_init。函数pthread_mutexattr_setpshared和函数 pthread_mutexattr_settype用来设置互斥锁属性。前一个函数设置属性pshared,它有两个取值, PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED。前者用来不同进程中的线程同步,后者用于同步本进程的不同线程。在上面的例子中,我们使用的是默认属性PTHREAD_PROCESS_ PRIVATE。后者用来设置互斥锁类型,可选的类型有PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、 PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT。它们分别定义了不同的上所、解锁机制,一般情况下,选用最后一个默认属性。
二 pthread_mutex_lock pthread_mutex_unlock pthread_delay_np
pthread_mutex_lock声明开始用互斥锁上锁,此后的代码直至调用pthread_mutex_unlock为止,均被上锁,即同一时间只能被一个线程调用执行。当一个线程执行到pthread_mutex_lock处时,如果该锁此时被另一个线程使用,那此线程被阻塞,即程序将等待到另一个线程释放此互斥锁。
分享到:
相关推荐
此文章系统的讲解了c语言下线程相关的 api及时候关使用场景.
1. 线程概述 2. 创建线程 2.1 线程函数 2.2 创建线程 3. 线程退出 4. 线程回收 4.1 线程函数 4.2 回收子线程数据 5. 线程分离 6. 其他线程函数 6.1 线程取消 6.2 线程 ID 比较
标题中的“基于C语言实现的C语言线程库”指的是一个使用C语言编写的线程库,线程库是用于创建和管理线程的软件组件,它为程序员提供了在操作系统中创建并行执行任务的接口。C语言由于其底层特性和广泛支持,常被用于...
通过配置线程调度策略与优先级,可使各线程按照设定的顺序执行,从而达到线程间同步的目的,线程属性配置函数包括: pthread_attr_init(&attr[i]);// 初始化线程属性 pthread_attr_setschedpolicy(&attr[i], SCHED...
本文将深入探讨C语言线程编程及其在Linux系统中的应用。 首先,理解线程的概念至关重要。线程是程序执行的最小单元,每个线程都有自己的程序计数器、栈和局部变量,但共享同一块内存空间,包括全局变量和静态变量。...
在C语言中,实现线程复制文件或文件夹涉及到多线程编程和文件操作的知识点。下面我们将详细探讨这些主题。 首先,让我们了解C语言中的线程。在C语言中,我们可以使用POSIX线程库(pthread库)来创建和管理线程。...
C语言的多线程包Posix的API参考chm格式
C语言线程终止练习示例 C语言线程终止练习示例主要介绍了C语言中线程的基本概念和操作,通过示例代码,展示了线程的创建、执行和终止的过程。 线程的基本概念 在计算机科学中,线程(Thread)是操作系统中的一种...
CCHAN 是一个小型的 C 语言库,旨在通过实现“通道”结构来简化线程间的通信。每个通道都是一个固定长度消息的 FIFO 队列,可以自动扩展以腾出空间存储未读消息。写入操作不会阻塞,多个线程可以同时写入和读取通道...
本文将详细讲解"c语言 日志分级 线程安全 slog"这一主题,以及如何利用名为`slog`的C语言实现的日志模块。 首先,让我们了解日志分级的概念。日志分级是一种管理日志输出的方法,它允许开发者根据信息的重要性和...
在C语言中实现循环缓冲区需要考虑线程安全问题,以确保在多线程环境下正确地读写数据。 首先,我们来看`cyc_buffer.c`和`cyc_buffer.h`这两个文件。`cyc_buffer.h`通常是头文件,包含循环缓冲区的定义和相关的函数...
用C语言写的Linux下的多线程
C语言作为一门底层且强大的编程语言,提供了丰富的系统调用接口来实现多进程和多线程编程。 **多进程(Multiprocessing)** 1. **进程定义**:进程是程序的一次执行实例,每个进程都有自己的独立内存空间,包括...
之前做过基于开发板的单线程2D游戏的开发!根据印象写的一个通用定时器,希望以后用的着,有需要的朋友欢迎下载交流! 例子请看资源:“VC写的字符界面贪吃蛇(原创)- 不闪屏” 环境:code::blocks + MinGW PS:...
C 语言多线程 多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。多线程可以提高应用程序的响应速度、使...
在多线程编程中,线程间通信是一个关键的概念,用于协调不同线程之间的操作,确保数据的一致性和正确性。本示例“线程间通信方式3:消息传递方式”着重介绍了通过消息传递实现线程间的通信。下面将详细阐述这种通信...
在Linux环境下进行C语言多线程编程,可以利用POSIX线程库,也称为pthread库。这个库提供了创建、同步和管理线程的一系列接口,使得开发者能够在单个进程中同时执行多个任务,从而提高程序的并行性。下面将详细探讨多...
在C语言中实现多线程是一项技术挑战,因为C语言本身并不直接支持多线程,而是依赖于特定的系统API或者库。在这个“c语言多线程操作”的项目中,开发者利用了VC++6.0的环境,这是一个早期的集成开发环境(IDE),它...
本次课程设计的目标是开发一个用户级线程库,功能包括完整的线程创建/删除/joining,互斥锁,条件变量,以及一个基于优先级的调度器。完成此用户级线程库,可以使用该线程库编写多线程的应用,替代 Linux 中的 ...
在IT领域,尤其是在系统编程和并发处理中,C语言多线程编程是一个重要的主题。线程池是一种优化的线程管理技术,它提高了系统资源的利用率,并降低了线程的创建和销毁开销。本文将深入探讨C语言中的线程池及其相关...