linux线程
需要链接库libpthread.a或者libpthread.so
创建线程pthread_create()
原型:int pthread_create(pthread_t *thread,
pthread_attr_t *attr,
void *(*start_routine)(void *),
void *arg);
pthread_t: typedef unsigned long int pthread_t;
attr这个参数用于设置线程的属性,可以为空使用默认属性
start_routine:线程函数
arg,线程函数运行时传入的参数
成功返回0
线程结束函数pthread_join()和pthread_exit()
原型:extern int pthread_join __P ((pthread_t __th,void **__thread_return));
__th为线程标识符,由pthread_create创建成功的值
__thread_return,线程返回值,是个指针,用来存储被等待线程的返回值。这个参数是个指向指针的指针类型参数。
通常:
int *ret_join =NULL;
pthread_join(pt,(void *)&ret_join);
原型:extern void pthread_exit __P ((void *__retval)) __attribute__((__noreturn__));
retval是个返回值,可以被pthread_join()捕获
线程的属性
属性结构
typedef struct __pthread_attr_s
{
int __detachstate; //线程的终止状态
int __schedpolicy; //调度优先级
int _sched_param __schedparam; //参数
int __inheritsched; //继承
int __scope //范围
size_t __guardsize; //保证尺寸
int __stackaddr_set; //运行栈
void *__stackaddr; //线程运行栈地址
size_t __stacksize; //线程运行栈大小
}pthread_attr_t;
设置线程优先级
int pthread_attr_setschedparam(pthread_attr_t *attr,const struct sched_param *param);
int pthread_attr_getschedpatam(const pthread_attr_t *attr,struct sched_param *param);
#include<stdio.h>
#include<pthread.h>
#include<sched.h>
pthread_attr_t attr;
struct sched_param sch;
pthread_t pt;
pthread_attr_init(&attr); //初始化属性设置
pthread_attr_getschedparam(&attr,&sch); //获取当前线程属性
sch.sched_priority=256;
pthread_attr_setschedparam(&attr,&sch); //设置线程优先级
pthread_create(&pt,&attr,(void *)start_routine,&run); //建立线程,使用属性
线程绑定状态
#include<pthread.h>
pthread_attr_t attr;
pthread_t tid;
pthread_attr_init(&attr);
pthread_attr_set_scope(&attr,PTHREAD_SCOPE_SYSTEM);
pthread_create(&tid,&attr,(void *)my_function,NULL);
线程的分离状态
默认的线程非分离状态,在pthread_join()函数返回时,线程才算终止,并且释放线程创建的时候系统分配的资源。分离线程不用其他线程等待。当前线程运行结束后线程就结束了,并且马上释放资源。
int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate);
detachstate可以是PTHREAD_CREATE_DETACHED(分离)、PTHREAD_CREATE_JOINABLE(非分离)
线程间的排斥
pthread_mutex_t fastmutex=PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t recmutex=PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
pthread_mutex_t errchkmutex=PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
int pthread_mutex_init(pthread_mutex_t *mutex_t,const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
使用信号量
初始化
extern int sem_init __P((sem_t *__sem,int __pshared,unsigned int __value));
sem指向一个信号量结构指针,pshared表示信号量共享类型,不为0时这个信号量可以在进程间共享,否则只在进程内共享,value设置信号量初始值
信号量增加函数sem_post()
int sem_post(sem_t *sem);
等待函数sem_wait()
减少信号量的值,如果信号量值为0,则线程会一直阻塞到信号量大于0为止。sem_wait每次使信号量减少1,为0时不减少
sem_destroy()
释放信号量
本文出自 “重剑无锋” 博客,请务必保留此出处http://qianyang.blog.51cto.com/7130735/1614990
原文地址:http://qianyang.blog.51cto.com/7130735/1614990