游双-Linux高性能服务器编程笔记

#define MAX_THREADS 1

class Test {
public:
	Test(): m_stop(false), s("Object exists.") {
		printf("ctor\n");
		m_threads = new pthread_t[MAX_THREADS];
		for (int i = 0; i < MAX_THREADS; i++) {
			pthread_create(m_threads + i, NULL, worker, this);
			pthread_detach(m_threads[i]);
		}
	}
	~Test() {
		delete [] m_threads;
		m_stop = true;
	}

private:
	static void* worker(void* arg) {
		printf("%Thread running\n");
		auto t = (Test*)arg;
		// while (!t->m_stop) {
		while (1) {
			printf("Hello from %d, %p\n", pthread_self(), t);
			printf("%s\n", t->s.c_str());
			sleep(1);
		}
	}
private:
	pthread_t* m_threads;
	bool m_stop;
    string s;
};

int main() {
	Test* t = new Test;
	
	sleep(5);
	delete t;
	printf("dtor done\n");
	sleep(5);
}

输出结果:

![](https://gitee.com/ara_zzy/PicGo/raw/master/img/20211214210631.png游双-Linux高性能服务器编程笔记

对象已经被释放,但是线程依然持有指向那个地址的指针,非常恐怖

如果使用m_stop判断:

游双-Linux高性能服务器编程笔记

正常,但是感觉还是有风险。

上一篇:Elasticsearch慢查询日志配置


下一篇:Redis的慢查询日志