码迷,mamicode.com
首页 > 编程语言 > 详细

linux线程

时间:2015-02-24 13:58:51      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:linux c   线程   

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

linux线程

标签:linux c   线程   

原文地址:http://qianyang.blog.51cto.com/7130735/1614990

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!