BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #95820同步于 2017/7/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

pthread_create函数

xiaobing307
2017/7/19镜像同步9 回复
#include <iostream> #include <string.h> #include <pthread.h> using namespace std; void* print_string(void* s) { cout << (char*)s << endl; } int main() { { char* str = new char[1024]; strcpy(str, "hello world"); pthread_t thread; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&thread, &attr, print_string, str); } sleep(1); return 0; } linux的man page上说: “after a call to pthread_create(), it is indeterminate which thread—the caller or the new thread—will next execute.” 有没有可能pthread_create新创建的线程还没开始跑,str局部变量已经销毁了? 如果str的定义是:char str[1024]; 在print_string函数打印之前,str数组可能已经销毁了吧? 如果像上面的代码一样,str只是一个指针,会有问题吗?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nuanyangyang机器人#1 · 2017/7/19
进程会在最后一个pthread线程结束之后才退出,所以new出来的内存肯定不会过早释放的。另外sleep对多线程的执行结果理论上没有任何影响,可以忽略掉。 如果str是局部变量,那么其实c语言规定一个线程的局部变量给另一个线程访问,是implementation-defined behaviour,就是机器冒不冒烟由编译器、标准库、操作系统等决定。 另外,pthread完全没有happens before这个概念,不保证“创建线程”这个动作happens before“被创建的线程里的第一个动作”。如果可以的话,用c++11的标准库吧,语义比pthread清楚得多。
xiaobing307机器人#2 · 2017/7/20
多谢 生产环境代码,不知道是否支持c++ 11,看别人用的pthread。 【 在 nuanyangyang 的大作中提到: 】 : 进程会在最后一个pthread线程结束之后才退出,所以new出来的内存肯定不会过早释放的。另外sleep对多线程的执行结果理论上没有任何影响,可以忽略掉。 : 如果str是局部变量,那么其实c语言规定一个线程的局部变量给另一个线程访问,是implementation-defined behaviour,就是机器冒不冒烟由编译器、标准库、操作系统等决定。 : 另外,pthread完全没有happens before这个概念,不保证“创建线程”这个动作happens before“被创建的线程里的第一个动作”。如果可以的话,用c++11的标准库吧,语义比pthread清楚得多。
nuanyangyang机器人#3 · 2017/7/20
辛苦了。看看能不能改改makefile把c++14启动吧。GCC6开始,g++的默认标准就是gnu++14了。 【 在 xiaobing307 的大作中提到: 】 : 多谢 : 生产环境代码,不知道是否支持c++ 11,看别人用的pthread。
shan10211865机器人#4 · 2017/7/20
这代码规范么,只有new,没有delete
xiaobing307机器人#5 · 2017/7/20
如果new出来的东西,在进程结束前一直要用,何必写delete 【 在 shan10211865 的大作中提到: 】 : 这代码规范么,只有new,没有delete
shan10211865机器人#6 · 2017/7/20
静态代码检查不提告警? 【 在 xiaobing307 的大作中提到: 】 : 如果new出来的东西,在进程结束前一直要用,何必写delete
Nroskill机器人#7 · 2017/7/20
你这种写法肯定是不会崩的,想崩的话改成这样 char str[] = "hello";
nuanyangyang机器人#8 · 2017/7/22
好奇:valgrind会不会报错? 【 在 xiaobing307 的大作中提到: 】 : 如果new出来的东西,在进程结束前一直要用,何必写delete
xiaobing307机器人#9 · 2017/7/22
会吧 【 在 nuanyangyang 的大作中提到: 】 : 好奇:valgrind会不会报错?