linux程序设计---多线程
来源:互联网 发布:淘宝快递上门取件时间 编辑:程序博客网 时间:2024/06/06 17:41
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); //这个也行。
/*
在编译多线程程序的时候,要加上-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:线程返回的状态码。
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);
一种是正常退出,可以使用的语句: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为零的话,就不执行指定的清除函数。
还是不正常的退出,就会执行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:信号量的初始值。
实现线程同步机制:信号量和互斥量。
信号量:
#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);信号量清除。
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);
互斥量:
#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 设置线程为脱离线程。
#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)
int pthread_attr_setschedpolicy(pthread_attr_t *attr,int policy)
8,取消一个线程。
#include <pthread.h>
int pthread_cancle(pthread_t thread);
#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 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.
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.
0 0
- 10、linux多线程程序设计
- LINUX 多线程程序设计
- linux多线程程序设计
- linux程序设计---多线程
- Linux多线程程序设计
- linux程序设计---多线程
- linux多线程程序设计
- Linux多线程程序设计
- Linux多线程程序设计
- Linux多线程程序设计
- Linux多线程程序设计
- 《linux程序设计》多线程学习
- Linux 多线程程序设计-LS13
- linux应用程序设计基础--多线程程序设计
- Linux多线程程序设计学习笔记
- Linux下多线程程序设计实验
- Linux笔记_多线程程序设计
- 【Linux C程序设计】创建多线程
- spring的WebUtils类源码解析
- 聊聊做码农的这些年,时光飞逝岁月无痕
- Tornado 简单入门教程(零)——准备工作
- 抛物线拟合算法的实现
- Java中Integer类的详解与用途
- linux程序设计---多线程
- Tornado 简单入门教程(一)——Demo1
- http error 503. the service is unavailable. sharepoint
- GRE数学常考词汇集合
- Android jni开发问题总结
- python编程中字典插入数组的误区
- 简单的socket 服务器/客户端 程序
- n!阶乘末尾有多少个零0
- centos搭建一个git服务器