1. 走读librdkafka-0.7的代码, 发现其destroy后,有内存泄露的问题;
2. 验证:通过 1000000次,创建kafka实例,释放实例;
即rk=rd_kakfa_new(); 然后rd_kafka_destroy(rk); 内存耗尽,导致程序退出;
3. 问题原因:
rk实例选用引用计数的思想来释放其资源;
对于生产者,其将引用计数设置为2:一个为为主线程(生产者线程); 一个发送线程 (消费者线程, 主线线程pthread_create 所得);
由于两者通过 互斥锁+条件变量,实现共享一个queue,实现数据的同步;
其通信模型:
1. 在rd_kafka_new中创建了消费者线程, 此时queue为空, 消费者线程阻塞pthread_cond_wait();
2. 生产者线程,每生产一个砖头,将砖头放进queue中,同时通过pthread_cond_signal 通知消费者线程;
3. 消费线程, 如果发现queue不为空,就去消费queue中砖头,直到queue为空,阻塞在pthread_cond_wait();
4. 消费者线程收到生产者的signal信号,转3.
问题,生产线程主动执行rd_kafka_destroy时,只能将引用计数减1,等待消费者线程主动退出;
此时有两个问题:
1. 消费者线程阻塞,永远不会退出,导致内存+pthread资源泄露;
2. 如果运气比较好,消费者线程恰好也退出了,但是,原有dest
2. 验证:通过 1000000次,创建kafka实例,释放实例;
即rk=rd_kakfa_new(); 然后rd_kafka_destroy(rk); 内存耗尽,导致程序退出;
3. 问题原因:
rk实例选用引用计数的思想来释放其资源;
对于生产者,其将引用计数设置为2:一个为为主线程(生产者线程); 一个发送线程 (消费者线程, 主线线程pthread_create 所得);
由于两者通过 互斥锁+条件变量,实现共享一个queue,实现数据的同步;
其通信模型:
1. 在rd_kafka_new中创建了消费者线程, 此时queue为空, 消费者线程阻塞pthread_cond_wait();
2. 生产者线程,每生产一个砖头,将砖头放进queue中,同时通过pthread_cond_signal 通知消费者线程;
3. 消费线程, 如果发现queue不为空,就去消费queue中砖头,直到queue为空,阻塞在pthread_cond_wait();
4. 消费者线程收到生产者的signal信号,转3.
问题,生产线程主动执行rd_kafka_destroy时,只能将引用计数减1,等待消费者线程主动退出;
此时有两个问题:
1. 消费者线程阻塞,永远不会退出,导致内存+pthread资源泄露;
2. 如果运气比较好,消费者线程恰好也退出了,但是,原有dest