xiaxue123的个人博客分享 http://blog.sciencenet.cn/u/xiaxue123

博文

LINUX小知识

已有 4049 次阅读 2012-10-15 22:45 |系统分类:科研笔记| 知识

                                          线程与进程(1)

线程的创建

 

int pthread_create(pthread_t *tid, const pthread_attr_t *attr,

     void *(*start_rtn)(void), void *arg);

 

pthread_create创建成功时返回0,tid存放创建线程的id,第二个参数为创建线程的属性,第三个为线程的执行路径,第四个参数为传给创建线程的参数

 

线程的退出

线程可以选择三种方式退出,在不终止整个进程的情况下停止它的执行流。

  1.     线程从启动例程中返回,返回值是线程的退出码。
  2.     线程被同一进程中的其它线程取消。
  3.     线程调用pthread_exit();
  4.     主进程结束,该进程中的所有线程也会被终止。(java,python中有一个守护线程的概念,是指专为普通用户线程服务的线程,当所有的用户线程退出时,所有的守护线程也要退出(没有了用户线程,守护线程也就没有了服务对象),整个进程也就结束

 

进程中的其它线程通过pthread_join来获取线程的终止状态。

void pthread_exit(void *retval);

void pthread_join(pthread_t tid, void **retval);

 

给线程传递参数

  1.      最好使用堆中的参数,但需要注意在线程结束后释放堆的空间。
  2.      如果使用栈中的参数,必须保证线程执行时,堆栈的数据空间没有被释放。

 

分离线程

在默认情况下,线程的终止会保存到对该线程调用pthread_join,如果主线程对它所创建的线程的终止状态并不感兴趣,则可让线程处于分离状态,这样,线程的底层资源可以再线程终止时立即被回收。

 创建带有分离属性的线程

 

pthread_t thread_id;

pthread_attr_t attr;

pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

pthread_create(&thread_id, &attr, &print_xs, (void*)arg);

pthread_detach(thread_id);

pthread_attr_destroy(&attr);

 

//这时,即使调用也不能获取到创建线程的终止状态

 int *res;

  pthread_join(thread_id, &res);

 

       使用pthread_detach使得指定线程处于分离转态

 

pthread_t thread_id;

pthread_create(&thread_id, &attr, &print_xs, (void*)arg);

pthread_detach(thread_id);

 

/* 或在创建的线程中分离自己,但如果线程调用pthread_detach之前,主线程已经调用thread_join,pthread_detach将不做任何事,此时pthread_join仍能获取到pthread_exit返回的状态。*/

void* print_xs (void* arg)

{

  pthread_detach(pthread_self());

  /* do some work */

}

   


https://blog.sciencenet.cn/blog-763397-622974.html

上一篇:痛苦是成熟的代价
下一篇:工作带给我的启示
收藏 IP: 61.150.43.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-16 21:24

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部