pthread_create 函数引发的几点思考
来源:互联网 发布:阿里云域名泛解析 编辑:程序博客网 时间:2024/06/07 01:58
pthread_create 函数引发的几点思考
1、 syscall(SYS_gettid) 与pthread_self的区别:
一个是系统调用(LWP),一个是POSIX定义的内容(pthread),两者并不一样,其中gettid常在core文件中看到。两者的值并不一样
2、 堆与栈的区别
堆是要自己申请并释放的,系统会回收(对于C++而言,对应于new和delete);但对于栈来说,系统回收的方法只是把栈顶指针往下移(让出存储空间),并没有实际释放对象,因此仍然可以访问到对象的值(只有不被覆盖,适用于大部分平台)。
3、 进程退出时,如何让出控制权
当主进程退出时,由主进程创建的线程也将退出。通过调用pthread_exit()可以让进程让出控制权,进而使子线程继续运行
程序代码:
#include<unistd.h>#include<sys/syscall.h>#include<pthread.h>#include<iostream>usingnamespace std;classTestClass{public: TestClass() {cout << __FUNCTION__<< " is called!" << endl;} ~TestClass() {cout << __FUNCTION__<< " is called!" << endl;} string str;};void*handler(void * arg){ cout << static_cast<TestClass*>(arg)->str << endl; //sleep for a while sleep(2); cout << "Process id = "<< getpid() << ",thread id = " << pthread_self() << ", gettid = "<< syscall(SYS_gettid) << endl; cout << static_cast<TestClass*>(arg)->str << endl; } intmain(int argc, char **argv){ pthread_t pid; { TestClassparam; param.str= "hello"; pthread_create(&pid,NULL, handler, ¶m); sleep(1); } //继续生成一个栈对象,有的平台上会替换原来的栈对象 TestClass param; param.str = "hello, world!"; cout << "Enterpthread_join" << endl; pthread_join(pid, NULL); pthread_exit(0); // 用这个函数,便可以去掉pthread_join函数,会等待子线程的退出,然后退出主线程 return 0;}
在centOS平台上运行该程序,结果如下:
在ubuntu 平台上运行,则上面空行会是 hello,world! ^_^不要诧异
如果传递过去的是堆对象,当对象析构后将无法得到正确的结果。一般做法在线程里面保存传入的参数。
0 0
- pthread_create 函数引发的几点思考
- android 横竖屏切换引发的几点思考
- 由观影引发的几点人生思考
- 关于函数的几点思考
- concat()函数引发的思考
- g++编译pthread_create函数的注意点
- 关于核函数和SVM的几点思考
- 职业规划的几点思考
- HTML5的几点思考
- QTAV的几点思考
- lowmemorykiller的几点思考
- 在线教育的几点思考
- QA的几点思考
- 从Main函数引发的static思考
- 从Main函数引发的static思考
- 一个函数命名所引发的思考
- 一个截取字符串函数引发的思考
- 由函数计时器引发的思考
- java反射详解
- 分享一个PHP中文分词
- 蟠桃会之教育、投资与幸福生活
- 100对黑白球问题的多种思路
- 机试算法讲解:第1题 冒泡排序与快速排序
- pthread_create 函数引发的几点思考
- 泛型依赖注入
- FlowLayout详解(二)——FlowLayout实现
- AutoRunner note
- 程序员,为什么千万不要重写代码?
- 《深入理解Nginx 模块开发与架构解析》笔记之epoll事件模块
- Tomcat 定制JNDI URL Resource
- Ubuntu上安装 Emacs 24的几种方法
- roman to integer