您的位置:首页 > 运维架构 > Linux

linux程序设计---多线程

2015-06-01 13:45 232 查看
linux程序设计---多线程

/*

在编译多线程程序的时候,要加上-lpthread选项,指定pthread库。在程序代码中包含线程头文件pthread.h。

*/

1,创建一个线程。

int pthread_create(pthread_t *pthread_id,const pthread_attr_t *attr,void *(*start_rtn)(void *),void *arg);

pthread_t *pthread_id: 线程id,有系统自动填充。

pthread_attr_t *attr:线程属性,一般情况下为NULL;

void *(*start_rtn)(void *):线程执行的函数。该函数的返回值是void类型的指针,函数参数也是void类型的指针,注意:

这个函数也可以不传递参数。

比如:

void *create(void *args); //标准形式。

void *create(void); //这个也行。

void *arg 线程执行函数的参数。

2,等待线程执行。

int pthread_join(pthread_t pthread_id,void **args);

pthread_t pthread_id:线程的id。

void **args:线程返回的状态码。

3,退出线程方法有两种:

一种是正常退出,可以使用的语句:return,pthread_exit(void *args);

二种是正常退出。

不可以使用exit和_exit,这样不但退出线程,而且会退出整个进程。

4,获取进程ID。

pthread_t pthread_self(void); 返回线程id.这个id跟pthread_creat中的第一个参数的值一样。

5,清除。

void pthread_cleanup_push(void (*rtn)(void *),void *args);

void (*rtn)(void *):指定清除函数。

void *args;清除函数的参数。

void pthread_cleanup_pop(int excute);

如果在pthread_cleanup_push和pthread_cleanup_pop之间的代码出现退出,不管是正常的pthread_exit退出(return 退出不算),

还是不正常的退出,就会执行pthread_cleanup_push指定的清除函数。如果之间的代码没有出现退出,只有excute为非零的时候

才执行pthread_cleanup_push中指定的清除函数,如果excute为零的话,就不执行指定的清除函数。

6,多线程的同步机制

实现线程同步机制:信号量和互斥量。

信号量:

#include<semaphore.h>

int sem_init(sem_t *sem,int pshared,unsigned int value); //信号量的初始化。

sem_t *sem:信号量,有系统进行分配。

int pshared:信号量共享标志,如果为0,信号量只能在本进程中使用,如果非零可以再其他进程中使用,常设置为0;

unsigned int value:信号量的初始值。

int sem_wait(sem_t *sem); 获取信号量,对信号量进行减一操作。

int sem_post(sem_t *sem);释放信号量,对信号量加一操作。

int sem_destory(sem_t *sem);信号量清除。

使用信号量操作共享数据时,注意操作时序。

互斥量:

#include <pthread.h>

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutex_attr);

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

int pthread_mutex_destroy(pthread_mutex_t *mutex);

7,线程的属性。

#include <pthread.h>

int pthread_attr_init(pthread_attr_t *attr); 线程属性初始化。

设置线程为脱离线程。

int pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate);

pthread_attr_t *attr:线程属性指针。

int detachstate:线程属性标志:PTHREAD_CREAT_JOIN,PTHREAD_CREAT_DETACHED.

线程属性标志缺省值为PTHREAD_CREAT_JOIN 及归并线程。PTHREAD_CREAT_DETACHED 设置线程为脱离线程。

设置线程调度策略。

int pthread_attr_setschedpolicy(pthread_attr_t *attr,int policy)

8,取消一个线程。

#include <pthread.h>

int pthread_cancle(pthread_t thread);

int pthread_setcanclestate(int state,int *oldstate); //设置线程的取消状态。

int state:如果为PTHREAD_CANCLE_ENABLE,允许线程接受取消请求。

如果为PTHREAD_CANCEL_DISABLE,不允许线程接受取消请求,屏蔽取消请求。

int *oldstate:获取线程以前的取消状态,如果不需要,设置为NULL;

int pthread_setcancletype(int type,int *oldtype); //设置取消类型。

int type:如果为PTHREAD_CANCLE_ASYNCHRONOUS,接到请求立马执行取消操作。

如果为PTHREAD_CANCLE_DEFERRED,执行取消操作之前,先执行以下函数之一:pthread_join,pthread_cond_wait,

pthead_cond_tomewait,pthread_testcancle,sem_waith,sigwait。

int *oldtype:索引以前的状态,如果不需要,直接为NULL;

在缺省状态下,线程启动时的取消状态为PTHEAD_CANCLE_ENABLE,取消类型为PTHREAD_CANCLE_DEFERRED.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: