返回信息流#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只是一个指针,会有问题吗?
这是一条镜像帖。来源:北邮人论坛 / cpp / #95820同步于 2017/7/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
pthread_create函数
xiaobing307
2017/7/19镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
进程会在最后一个pthread线程结束之后才退出,所以new出来的内存肯定不会过早释放的。另外sleep对多线程的执行结果理论上没有任何影响,可以忽略掉。
如果str是局部变量,那么其实c语言规定一个线程的局部变量给另一个线程访问,是implementation-defined behaviour,就是机器冒不冒烟由编译器、标准库、操作系统等决定。
另外,pthread完全没有happens before这个概念,不保证“创建线程”这个动作happens before“被创建的线程里的第一个动作”。如果可以的话,用c++11的标准库吧,语义比pthread清楚得多。
多谢
生产环境代码,不知道是否支持c++ 11,看别人用的pthread。
【 在 nuanyangyang 的大作中提到: 】
: 进程会在最后一个pthread线程结束之后才退出,所以new出来的内存肯定不会过早释放的。另外sleep对多线程的执行结果理论上没有任何影响,可以忽略掉。
: 如果str是局部变量,那么其实c语言规定一个线程的局部变量给另一个线程访问,是implementation-defined behaviour,就是机器冒不冒烟由编译器、标准库、操作系统等决定。
: 另外,pthread完全没有happens before这个概念,不保证“创建线程”这个动作happens before“被创建的线程里的第一个动作”。如果可以的话,用c++11的标准库吧,语义比pthread清楚得多。
辛苦了。看看能不能改改makefile把c++14启动吧。GCC6开始,g++的默认标准就是gnu++14了。
【 在 xiaobing307 的大作中提到: 】
: 多谢
: 生产环境代码,不知道是否支持c++ 11,看别人用的pthread。
如果new出来的东西,在进程结束前一直要用,何必写delete
【 在 shan10211865 的大作中提到: 】
: 这代码规范么,只有new,没有delete
静态代码检查不提告警?
【 在 xiaobing307 的大作中提到: 】
: 如果new出来的东西,在进程结束前一直要用,何必写delete
好奇:valgrind会不会报错?
【 在 xiaobing307 的大作中提到: 】
: 如果new出来的东西,在进程结束前一直要用,何必写delete