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.
/*
在编译多线程程序的时候,要加上-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.
相关文章推荐
- 《Linux开发环境搭建一》在VMware虚拟机上安装Ubuntu 10.04
- linux面试题及答案
- Linux 内核/sys 文件系统介绍
- How To install FFMPEG, FLVTOOL2, MP4Box on CentOS server 2015 easy method
- linux学习大量核心技术视频(全免费观看)-干货!
- Linux KVM - 記憶體最佳化管理與應用
- linux -- Ubuntu修改静态IP地址重启后无法上网的解决
- Linux 的启动流程
- 虚拟机下linux中安装JDK的下载网址
- Linux引导流程解析(1)
- CentOS6.4 配置iptables
- netstat
- linux 安全
- linux下第一个C程序
- linux 硬盘分区攻略
- linux 4000 磁盘管理(RHEL)
- linux(rhel) rescue修复详解
- linux学习笔记—提升输入效率的方法
- Linux 生成SSL证书
- linux tar.gz zip 解压缩 压缩命令