c/c++ 多线程 detach的困惑
2024-10-16 03:23:01
多线程 detach的困惑
求大神解答:
1,当在一个函数里启动一个线程后,并detach了
2,detach的线程里使用了这个函数里new出来的一个对象
3,detach后,delete了这个对象
4,为什么detach在线程里,使用了在3处delete的内存还不报错误???
-----start 更新分割线2018/10/27 上午-------------
回答4的问题:
线程还没来得及执行,main函数就执行完了,直接杀死还没有执行完的线程,所以线程里使用了已经delete的内存,也没有出错。如果在main函数里调用sleep(2),就会出错误。
如果当main函数结束后,还不想结束其他由main函数创建的子线程,就必须调用下pthread_exit(NULL)。
#include <iostream>
#include <thread>
#include <unistd.h>
using namespace std;
class bad{
public:
bad(int* i) : data(i){
cout << "addr2:" << data << endl;
}
void operator()(){
for(unsigned j = 0; j < 10000000000; ++j){
something(data);
}
}
private:
void something(int* i){
*i = 100;
cout << *i << endl;
};
int* data;
};
void func(){
int* local = new int(10);
cout << "addr1:" << local << endl;
bad b(local);
delete local;
thread t(b);
//cout << "before join " << *local << endl;
cout << "end delete" << endl;
t.detach();
//t.join();
cout << "after join " << *local << endl;
cout << "func end" << endl;
}
int main(){
func();
pthread_exit(NULL);
cout << "end" << endl;
}
c/c++ 学习互助QQ群:877684253
本人微信:xiaoshitou5854
最新文章
- Redmine性能测试
- C++ 箴言
- 『TCP/IP详解——卷一:协议』读书笔记——11
- 关于MYSQL数据库安装方式及相关设置简要说明
- SimPholders Xcode快速访问沙盒
- php加速运行优化
- AJAX-----02远古时期的ajax
- mysql update中需要根据条件列更新写法update case
- Select Statement Syntax [AX 2012]
- junit4 javaee 5.0 jpa SSH 单元测试问题集锦
- UVa 11178 (简单练习) Morley&#39;s Theorem
- Squid代理服务器&;&;搭建透明代理网关服务器
- angularjs中sortable的使用
- sql递归查询语句
- Treblecross 博弈SG值
- Linux read line
- BZOJ.3653.谈笑风生(长链剖分/线段树合并/树状数组)
- html表格的基本用法
- linux telnet命令
- mysql常用参数监控