正确得到线程退出信息的方法详解-变量存储退出信息结构、使用动态存储的方式退出信息结构、使用全局变量方式推相互信息结构、使用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函数时,它也是在程序运行时回收资源。

版权声明:转载请注明出处

将登录等信息保存到session中和退出session

做项目时,可能会将某些信息保存在session中,如登录等信息,这样方便在某些页面使用这些保存的信息。 要想保存这些信息,需要创建一个类,该类里面定义需要保存的变量等信息,当登录后就通过该类来保存登录...
  • muyeju
  • muyeju
  • 2015年09月28日 09:28
  • 1933

编程实现顺序存储结构和链式存储结构线性表的建立、查找、插入、删除等基本操作

#include #include typedef struct LNode{ int data; //链表数据 struct LNode* next; //链表指针 }LNode,...
  • foreverlove111
  • foreverlove111
  • 2017年10月30日 17:08
  • 448

使用结构体存储多变量类型数据

1:需要存储的变量具有多种类型时(char/int/float),采用结构体整体写入和读取的思路,不需要考虑结构体对齐;  2:动态申请100个字节大小的buff,认为buff等同于FLASH、E2...
  • Golf_research
  • Golf_research
  • 2016年08月31日 17:02
  • 814

无法使用前导 .. 在顶级目录上退出。

最终引起这个问题的是这样的字段:Url=../*/*,所以,以后排查这种错误的时候,主要需要检查的是Url是否对应了../或者~/,这样的写法,很容易出现问题,下面列一些我当时搜索到的解决这个问题的连...
  • u013036688
  • u013036688
  • 2015年07月18日 19:57
  • 2560

线性存储结构-LinkedList

LinkedList内部采用链表的形式构建,是一个双向链表。除了继承List外,还继承了Deque接口,可以当做堆栈结构使用。 private static final class Link { ...
  • junbin1011
  • junbin1011
  • 2016年11月14日 16:46
  • 1217

用FragmentActivity模仿qq群组,好友等滑动界面切换.

效果如图 下载地址  http://download.csdn.net/my/uploads MainActivity.java package com.aven.qqdemo; impo...
  • jansin_love
  • jansin_love
  • 2013年05月23日 11:48
  • 17069

数据结构的几种存储方式

数据的存储结构是数据结构的一个重要内容。在计算机中,数据的存储结构可以采取如下四中方法来表现。 1)           顺序存储方式 简单的说,顺序存储方式就是在一块连续的存储区域 一个接着一...
  • king_zxy
  • king_zxy
  • 2017年02月21日 18:38
  • 1482

《数据结构》线性表:链式存储结构实现示例代码二(插入、删除、查找)

#include //引用输入输出流库函数的头文件 //#ifndef LinkList_H //#define LinkList_H /***************************...
  • u013847155
  • u013847155
  • 2014年08月16日 00:26
  • 1975

四种数据存储结构---顺序存储 链接存储 索引存储 散列存储

存储结构分四类:顺序存储、链接存储、索引存储和散列存储。
  • oohaha_123
  • oohaha_123
  • 2014年05月28日 21:02
  • 1472

SD卡存储结构

SD卡FAT32文件系统 /*************************************************************************************...
  • banruoju
  • banruoju
  • 2016年12月30日 09:10
  • 1418
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:正确得到线程退出信息的方法详解-变量存储退出信息结构、使用动态存储的方式退出信息结构、使用全局变量方式推相互信息结构、使用main函数中的局部变量存储退出信息结构
举报原因:
原因补充:

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