pthread多线程

在编译时注意加上-lpthread参数,以调用静态链接库。因为pthread并非Linux系统的默认库

 

简介

POSIX thread 简称为pthread,Posix线程是一个POSIX标准线程.该标准定义内部API创建和操纵线程.在Linux中,一般pthread线程库是一套通用的线程库,是由POSIX提出的,因此具有很好的可移植性。 

 

作用

线程库实行了POSIX线程标准通常称为pthreads.pthreads是最常用的POSIX系统如Linux和Unix,而微软Windowsimplementations同时存在.举例来说,pthreads-w32可支持MIDP的pthread   

Pthreads定义了一套 C程序语言类型、函数与常量,它以 pthread.h 头文件和一个线程库实现。

 

数据类型

pthread_t:线程句柄   

pthread_attr_t:线程属性

线程操纵函数(简介起见,省略参数)

pthread_create():创建一个线程   

pthread_exit():终止当前线程   

pthread_cancel():中断另外一个线程的运行   

pthread_join():阻塞当前的线程,直到另外一个线程运行结束   

pthread_attr_init():初始化线程的属性   

pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)

pthread_attr_getdetachstate():获取脱离状态的属性   

pthread_attr_destroy():删除线程的属性   

pthread_kill():向线程发送一个信号

 

同步函数

用于 mutex 和条件变量   

pthread_mutex_init() 初始化互斥锁   

pthread_mutex_destroy() 删除互斥锁   

pthread_mutex_lock():占有互斥锁(阻塞操作)   

pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。当互斥锁空闲时将占有该锁;否则立即返回  

pthread_mutex_unlock(): 释放互斥锁   

pthread_cond_init():初始化条件变量   

pthread_cond_destroy():销毁条件变量   

pthread_cond_wait(): 等待条件变量的特殊条件发生

pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程      

Thread-local storage(或者以Pthreads术语,称作 线程特有数据):   

pthread_key_create(): 分配用于标识进程中线程特定数据的键   

pthread_setspecific(): 为指定线程特定数据键设置线程特定绑定   

pthread_getspecific(): 获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中   

pthread_key_delete(): 销毁现有线程特定数据键

 

与一起工作的工具函数

pthread_equal(): 对两个线程的线程标识号进行比较   

pthread_detach(): 分离线程   

pthread_self(): 查询线程自身线程标识号
--------------------- 

pthread_create 函数:

所需文件头:    
#include <pthread.h>

函数原型:

int pthread_create((pthread_t*thread,pthread_attr_r*attr,void*(*start_routine)
(void*),void *arg))

函数传入值:

thread:线程标识符

 

attr: 线程属性设置 null表示采用默认

 

start_roitine : 线程函数的启示地址

 

arg :传递给start_routine的参数

函数返回值:

成功:0
出错:-1

pthread_exit函数

所需文件头:    
#include <pthread.h>

函数原型:

Void pthread_exit(void *retval)

函数传入值:

retval:调用者线程的返回值,可由其他函数如pthread_join来检索获取。

pthread_join函数

所需文件头:    
#include <pthread.h>

函数原型:

int pthread_join ((pthread_t th,void **thread_return))

函数传入值:

th: 等待线程的标识符 
thread_return:用户定义的指针,用来存储被等待线程的返回值(不为NULL时)

函数返回值:

成功:0

 

出错:-1

取消一个线程 
有时候,我们想让一个线程 能够请求另外一个线程结束,就像给它发送一个信号似的。用线程程是可以完成这一操作的,而与单处理经,线程在被要求结束执行的时候还有一种改变其行为的办法。 
我们来看看要求一个线程结束执行的函数

所需文件头:    
#include <pthread.h>

函数原型:

int pthread_cancel(pthread_t thread);

函数传入值:

thread:线程的标识符

函数返回值:

成功:0

 

出错:-1

这个定义很明白,给定一个线程标识符,我们就能要求取消它。但在取消线形程请求的接收端,事情会稍微复杂一些,好在也不是太复杂。线形程可以用pthread_setcancelstate设置自己的取消状态,下面是这个函数的定义:

所需文件头:    
#include <pthrea.h>

函数原型:

int pthread_setcancelstate(int state,int *oldstate);

函数传入值:

state:可以是PTHREAD_CANCEL_ENABLE,这个值允许线程接收取消请求;还可以是PTHREAD_CANCEL_DISABLE,它的作用是屏幕它们。 
线程以前的取消状态可以用oldstate指针检索出来。如果没兴趣可以传一个NULL进去。

函数返回值:

成功:0

 

出错:-1

如果取消请求被接受了,线程会进入第二个控制层次----用pthread_setcanceltype设置取消类型。

所需文件头:    
#include <pthrea.h>

函数原型:

int pthread_setcanceltype(int type,int *oldstate);

函数传入值:

type:可以有两种取值,一个是PTHREAD_CANCEL_ASYNCHORONOUS,接收到取消请求之后立刻采取行动;另一个是PTHREAD_CANCEL_DEFERRED,在接收到取消请求之后、采取实际行动之前,先执行以下几个函数之一:pthread_join、pthread_cond_wait、pthread_cond_timewait、pthread_testcancel、sem_wait或sigwait。

函数返回值:

成功:0

 

出错:-1

稍微注意一点就是在android-ndk-r3 里是不支持int pthread_cancel(pthread_t thread); 所以想强制退出线程似乎没有更好的办法。

=================================================================================

 

linux多线程pthread的函数声明在<pthread.h>中,因此在使用该函数时,需要把该头文件引入。

 
线程的创建
1、创建

int pthread_create( pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(* func) (void *), void *restrict arg );

attr: 线程属性包括:优先级、初始栈大小,是否应该成为一个守护线程。

缺省设置,NULL

tidp是要创建的线程,创建成功后tipd为先线程的id

 

void *(* func) (void *)是一个函数指针,该函数指针的类型为void* (*)(void *)

是一个参数为void *,返回值也为void *的函数类型。它的一个简单的例子如下

void *thread_handler(void *arg)

{

 return NULL;

}

void *restrict arg
中的arg是void *(* func) (void *)函数指针的参数。

补充:函数声明中多次出现了restrict,其实这是用于CPU对函数的优化使用的,restrict的使用,由程序员保证使用restrict标志的参数间不会有内存重叠。

 

获取线程自身的id

pthread_t pthread_self(void);

 

等待给定线程终止

int pthread_join( pthread_t tid, void **status);

statues返回等待线程的返回值

单个线程有三种退出方式

1.线程从启动例程中返回(return方式),返回值是现成的退出码

2.线程被同一进程内的其他线程取消

3.线程调用pthread_exit退出。void pthread_exit(void *rval_ptr)

 

线程清理处理程序

void pthread_clean_push(void (*rtn)(void *),void *arg)

void pthread_clean_pop(iny excute)

清理函数rtn的调用顺序是由pthread_clean_push函数安排的。

它在下列几种情况下执行:

1.调用pthread_exit时

2.响应取消请求时

3.用非零execute参数调用pthread_clean_pop时

如果execute参数为0,清理函数将不被调用。无论何种情况,pthread_clean_pop都将删除上次pthread_clean_push建立的清理处理程序。

如果线程使用return从例程返回,那么pthread_clean_push建立的清理处理程序不会被执行。
--------------------- 
作者:阳光岛主 
来源:CSDN 
原文:https://blog.csdn.net/ithomer/article/details/5920936 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

线程同步的处理方法包括:信号量,互斥锁和条件变量

2、互斥锁
互斥锁是通过锁的机制来实现线程间的同步问题。互斥锁的基本流程为:

初始化一个互斥锁:pthread_mutex_init()函数
加锁:pthread_mutex_lock()函数或者pthread_mutex_trylock()函数
对共享资源的操作
解锁:pthread_mutex_unlock()函数
注销互斥锁:pthread_mutex_destory()函数
其中,在加锁过程中,pthread_mutex_lock()函数和pthread_mutex_trylock()函数的过程略有不同:

当使用pthread_mutex_lock()函数进行加锁时,若此时已经被锁,则尝试加锁的线程会被阻塞,直到互斥锁被其他线程释放,当pthread_mutex_lock()函数有返回值时,说明加锁成功;
而使用pthread_mutex_trylock()函数进行加锁时,若此时已经被锁,则会返回EBUSY的错误码。
同时,解锁的过程中,也需要满足两个条件:

解锁前,互斥锁必须处于锁定状态;
必须由加锁的线程进行解锁。
当互斥锁使用完成后,必须进行清除。
--------------------- 
作者:zhiyong_will 
来源:CSDN 
原文:https://blog.csdn.net/google19890102/article/details/62047798 
版权声明:本文为博主原创文章,转载请附上博文链接!

pthread是一种使用C语言编写的多线程库,它可以方便地实现多线程并行编程。使用pthread库,我们可以在一个进程中创建多个线程,每个线程可以同执行不同的任务,以实现并行处理。 pthread库的优势主要有以下几点: 1. 提高程序的运行效率:多线程可以将一个任务划分成若干个子任务,每个子任务由一个线程处理,从而充分利用多核处理器的性能,提高程序的运行效率。 2. 提升程序的响应性能:多线程可以将繁重的计算或耗的任务放在后台线程中进行处理,使得前台线程能够响应用户的操作,提升程序的响应性能。 3. 简化编程复杂度:使用pthread库可以方便地创建、管理和控制多个线程,提供了丰富的线程相关的函数和工具,可以简化多线程编程的复杂度。 在pthread多线程并行编程中,我们需要注意以下几点: 1. 线程的创建和销毁:使用pthread库可以通过pthread_create函数创建一个新线程,并通过pthread_join函数等待线程的结束。在合适的机,我们需要使用pthread_exit函数主动退出线程,以释放资源。 2. 线程的同步和互斥:多个线程之间可能会访问共享资源,我们需要使用pthread_mutex_t互斥锁来确保同一间只有一个线程可以访问共享资源,以避免竞争条件的发生。 3. 线程的通信和协作:线程之间可以通过共享内存、全局变量等方式进行通信。多个线程之间可以通过条件变量(pthread_cond_t)和信号量(sem_t)等机制进行协作,实现任务的分配和控制。 总之,pthread多线程并行编程可以充分利用多核处理器的性能,实现任务的并行处理,提高程序的运行效率和响应性能。但在编程过程中需要注意线程的创建和销毁、线程的同步和互斥、线程的通信和协作等问题,以确保多线程程序的正确性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值