linux程序设计 线程 多线程编程 信号量

线程:
创建一个新线程:pthread_create
#include <pthread.h>
int pthread_create(pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)((void *),void *arg);
"void *(*start_routine)(void *)"表示需要传递的是一个函数的地址,该函数以一个指向void的指针为参数,返回的也是一个指向void的指针。再就是新线程将要执行的函数。
调用成功返回0,调用失败返回错误,

※※※ pthread_create和大多数与线程有关的函数在操作失败时不返回“-1”。

结束一个线程:
void pthread_exit (void *retval);

int pthread_join(pthread_t th, void **thread_return);相当与用来等待子进程的wait函数,它的作用时在线程结束后把它们归并在一起。第一个参数是将有等待的线程,它就是pthread_create返回的那个标识符。第二个参数是个指针,它指向另外一个指针,而后者指向线程的返回值。


同步方法:
第一种:信号量;
第二种:互斥量;

信号量函数的名字都以"sem_"打头。线程使用的基本信号量函数有四个。
#include <semaphore.h>
int sem_init (sem_t *sem , int pshared, unsigned int value);
这是对由sem指定的信号量进行初始化,设置好它的共享选项(linux 只支持为0,即表示它是当前进程的局部信号量),然后给它一个初始值VALUE。

两个原子操作函数:
int sem_wait(sem_t *sem);
int sem_post(sem_t *sem);
这两个函数都要用一个由sem_init调用初始化的信号量对象的指针做参数。
sem_post:给信号量的值加1;
sem_wait:给信号量减1;对一个值为0的信号量调用sem_wait,这个函数将会等待直到有其它线程使它不再是0为止。

int sem_destroy(sem_t *sem);
这个函数的作用是再我们用完信号量后都它进行清理。归还自己占有的一切资源。

互斥量进行同步:
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destory(pthread_mutex_t *mutex);


线程属性:
#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
这个函数的作用是对一个线程属性对象进行初始化。


int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param
*param);
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param
*param);
int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit);
int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit);
int pthread_attr_setscope(pthread_attr_t *attr, int scope);
int pthread_attr_getscope(const pthread_attr_t *attr, int *scope);
int pthread_attr_setstacksize(pthread_attr_t *attr, int scope);
int pthread_attr_getstacksize(const pthread_attr_t *attr, int *scope);

detachstate属性:这个属性允许我们不对线程进行重新归并。pthread_attr_setdetachstate用到的两个标志分别为:
PTHREAD_CREATE_JOIN:缺省设置是这个,允许两个线程归并;
PTHREAD_CREATE_DETACHED:设置成这个就不能调用pthread_join来检查另一个线程的退出状态了。

schedpolicy属性:控制线程的时间分配方式。它的可用取值是:
SCHED_OTHER:缺省值,另外两个只能使用以超级用户运行的进程里。
SCHED_RP:轮转定时
SCHED_FIFO:先入先出

schedparam属性:它是schedpolicy属性的一个搭档,它对以SCHED_OTHER定时策略运行的线程的时间分配进行控制。

inheritsched属性:可用值有两个:
PTHREAD_EXPLICT_SCHED:缺省,表示时间分配由属性来明确设置
PTHREAD_INHERIT_SCHED:表示沿用它创建者的参数。

 


取消一个线程:
#include <pthread.h>
int pthread_cancel (pthread_t thread);

接收取消的线程可通过pthread_setcancelstate设置自己的取消状态:
int pthread_setcancelstate(int state ,int *oldstate);
第一个参数:PTHREAD_CANCEL_ENABLE:允许取消;
PTHREAD_CANCEL_DISABLE:屏蔽取消消息。
old_state 可设置为NULL;

如果取消被接受了,用pthread_setcanceltype设置取消类型;

int pthread_setcanceltype(int type, int *oldtype);
 type参数有两种取值:
PTHREAD_CANCEL_ASYNCHRONOUS:接收取消请求后立即行动。
PTHREAC_CANCEL_DEFERRED:在行动之前执行以下几个函数之一:pthread_join,pthread_cond_wait,pthread_cond_tomewait,pthread_testcancel,sem_wait,sigwait.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值