正确得到线程退出信息的方法详解-变量存储退出信息结构、使用动态存储的方式退出信息结构、使用全局变量方式推相互信息结构、使用main函数中的局部变量存储退出信息结构

原创 2014年11月09日 21:02:30
正确得到线程退出信息的方法详解-变量存储退出信息结构、使用动态存储的方式退出信息结构、使用全局变量方式推相互信息结构、使用main函数中的局部变量存储退出信息结构
 #include <pthread.h>
 void pthread_exit(void *value_ptr);
value_ptr:是线程的返回值。有pthread_join()检测获得。
功能:线程退出
#include<pthread.h>
int pthread_join(pthread_t thread, void**value_ptr);
功能:等待指定的线程结束。
返回值:成功返回0
参数:
thread:等待线程的ID(标示符)
value_ptr:用户自定义的指针,用来保存被等待线程的返回值。


分析如何正确得到:在线程结束运行后,Linux内核中保存只是内存退出内存区域的首地址,而并非将退出信息实际保存在内核中,因此,在线程结束运行后,其保存退出信息的内存区域仍然是有效的,所以不能把退出信息存储在局部变量中,而应使用动态分配的内存或是全局变量。





下面程序使用局部变量存储退出信息结构、使用动态存储的方式退出信息结构、使用全局变量方式推相互信息结构、使用main函数中的局部变量存储退出信息结构,演示了不同的方式正确的到退出信息的方法。






#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>


struct a
{
int b,c;

};//测试使用的结构体。
struct a r3;//全局变量


void *fn1(void *arg)//使用局部变量存储退出信息结构
{
struct a r1;
printf("first\n");
r1.b=1;
r1.c=2;
return (void *)&r1;
}


void *fn2(void *arg)//使用动态存储的方式退出信息结构
{
struct a *r2;
printf("second\n");

r2=(struct a *)malloc(sizeof(struct a));

r2->b=1;
r2->c=2;

return (void *)r2;

}


void *fn3(void *arg)//使用全局变量方式推相互信息结构
{
printf("third\n");

r3.b=1;
r3.c=2;

return (void *)(&r3);

}


void *fn4(void *arg)//使用main函数中的局部变量存储退出信息结构
{
struct a *r4=(struct a*)arg;
r4=(struct a *)malloc(sizeof(struct a));
printf("fourth\n");
r4->b=1;

r4->c=2;

return (void *)r4;

}


int main()
{


pthread_t tid1,tid2,tid3,tid4;
void *temp;

void *res;

int err;

err=pthread_create(&tid1,NULL,fn1,NULL);
if(err!=0)
{
printf("fail to fn1\n");
exit(1);

}
err=pthread_join(tid1,&res);
if(err!=0)
{
printf("can't join\n");
exit(1);
}

printf("1st result :%d,%d\n",((struct a*)res)->b,((struct a*)res)->c);


err=pthread_create(&tid2,NULL,fn2,NULL);
if(err!=0)
{
printf("fail to fn2\n");
exit(1);

}
err=pthread_join(tid2,&res);
if(err!=0)
{
printf("can't join\n");
exit(1);
}

printf("2st result :%d,%d\n",((struct a*)res)->b,((struct a*)res)->c);


err=pthread_create(&tid3,NULL,fn3,NULL);
if(err!=0)
{
printf("fail to fn3\n");
exit(1);

}
err=pthread_join(tid3,&res);
if(err!=0)
{
printf("can't join\n");
exit(1);
}

printf("3st result :%d,%d\n",((struct a*)res)->b,((struct a*)res)->c);


err=pthread_create(&tid4,NULL,fn4,temp);
if(err!=0)
{
printf("fail to fn1\n");
exit(1);

}
err=pthread_join(tid4,&res);
if(err!=0)
{
printf("can't join\n");
exit(1);
}

printf("4st result :%d,%d\n",((struct a*)res)->b,((struct a*)res)->c);


return 0;

}

运行结果



结论分析:第一个线程退出信息是没有用的,因为它用的是局部变量,在线程结束时就会释放,因此不起作用。而是用全局变量是在程序结束时系统才回回收资源,而动态申请的内存如果在没有遇到free函数时,它也是在程序运行时回收资源。

版权声明:转载请注明出处 https://blog.csdn.net/guoqianqian5812/article/details/40954549

sap 信息结构Logistics Information System

  • 2009年01月15日 13:13
  • 250KB
  • 下载

产品设计(2.1)PRD写作 – 罗列信息(信息结构图)

2.1、罗列信息(信息结构图) 在写产品需求文档之前,我们需要先罗列出产品功能的信息内容,这一步是将想法逐渐清晰的第一步,也是帮助我们接下来设计功能的辅助信息,同时也可以辅助服务端技术人员创建数据库...
  • chaishen10000
  • chaishen10000
  • 2015-05-31 23:17:12
  • 762

HDFS源码分析(三)-----数据块关系基本结构

前言正如我在前面的文章中曾经写过,在HDFS中存在着两大关系模块,一个是文件与block数据块的关系,简称为第一关系,但是相比于第一个关系清晰的结构关系,HDFS的第二关系就没有这么简单了,第二关系自...
  • Androidlushangderen
  • Androidlushangderen
  • 2015-08-18 23:38:15
  • 2676

int 13H int 10H int 15H

一、int 13h中断                  对于1.44MB的软盘来讲,总共有两面(磁头号0和1),每面有80个柱面(0-79),每个柱面有18个扇区。软盘的容量的由来:2×80×1...
  • jltxgcy
  • jltxgcy
  • 2013-03-18 16:51:06
  • 2470

介绍两种种方法,使main函数等待不退出

下面介绍两种种方法,使main函数等待不退出 一、等待输入 1.new BufferedReader(new InputStreamReader(System.in)).readLine();  ...
  • xxj_jing
  • xxj_jing
  • 2017-04-07 11:21:07
  • 2423

一般企业网站表结构信息

--下载信息表CREATE TABLE [dbo].[shuimutingDownload](    [ID] [int] IDENTITY(1,1) NOT NULL,    [Title] [nv...
  • ws_hgo
  • ws_hgo
  • 2010-05-04 17:11:00
  • 2041

Bitmap位图结构

Bitmap位图结构 一、位图数据结构 BMP文件的数据按照从文件头开始的先后顺序分为四个部分: ◆ 位图文件头(bmp file header):  提供文件的格式、大小等信息 ◆ 位图信息...
  • zh_98
  • zh_98
  • 2017-10-12 17:20:34
  • 259

Android 用sp存储登录状态以及退出登录

public class SharedPrefUtility { private static final String FILE_NAME = "share_date"; pub...
  • qq_31008549
  • qq_31008549
  • 2017-01-23 09:55:51
  • 1967

C语言编程日志

 2007-9-23:1.在调用函数时,若形参函数为数组与指针类型,函数调用时传递给形参的值应为指针或数组名。如例:#include "stdio.h"int jdg(char *a,char d);...
  • huybin_wang
  • huybin_wang
  • 2007-10-25 10:10:00
  • 1235

使用封装的XML类存取树层次结构

XML类基本操作: 在当前层新增一元素: CXMLDeal::AddElem(L”新增元素”) CXMLDeal::AddAttrib(L”属性”, int _or_...
  • shuilan0066
  • shuilan0066
  • 2012-07-12 16:34:47
  • 2080
收藏助手
不良信息举报
您举报文章:正确得到线程退出信息的方法详解-变量存储退出信息结构、使用动态存储的方式退出信息结构、使用全局变量方式推相互信息结构、使用main函数中的局部变量存储退出信息结构
举报原因:
原因补充:

(最多只允许输入30个字)