linux程序设计---多线程

来源:互联网 发布:京东广告部算法工程师 编辑:程序博客网 时间:2024/06/06 19:38
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
 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
 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
 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
 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.
 
 
 
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(93) | 评论(0) | 转发(0) |
0

上一篇:关于might_sleep的一点说明

下一篇:运行不息的内核线程kthread

相关热门文章
  • linux 常见服务端口
  • 【ROOTFS搭建】busybox的httpd...
  • xmanager 2.0 for linux配置
  • 什么是shell
  • linux socket的bug??
  • linux dhcp peizhi roc
  • 关于Unix文件的软链接
  • 求教这个命令什么意思,我是新...
  • sed -e "/grep/d" 是什么意思...
  • 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~