在编译时注意加上-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
版权声明:本文为博主原创文章,转载请附上博文链接!