cpp-ipc icon indicating copy to clipboard operation
cpp-ipc copied to clipboard

ubuntu 下chan作为全局变量或者单例成员,程序退出时崩溃

Open binfeng-young opened this issue 4 years ago • 10 comments

image

image

binfeng-young avatar Nov 22 '21 03:11 binfeng-young

你可以尝试下develop分支下的代码,在那个里面我换掉了底层的sync实现。

mutouyun avatar Nov 22 '21 06:11 mutouyun

尝试了下,结果还是会崩溃。

binfeng-young avatar Nov 22 '21 06:11 binfeng-young

挂在相同的地方吗?应该不同吧,毕竟sync的代码都完全变了 请问有最小复现代码么?还是说在你的环境里,只要写全局变量,退出就崩溃? 是linux下的g++么?

mutouyun avatar Nov 23 '21 09:11 mutouyun

我是在WSL里面编译运行的,跟这个平台有关系吗。 挂在这里 image

#include "libipc/ipc.h" //::ipc::channel ipc2 {"abc", ::ipc::receiver}; // 这一行注释掉就复现,打开的话就不会崩溃 ::ipc::channel ipc1; int main(int argc, char ** argv) { ipc1 = ipc::channel{"abc", ::ipc::sender}; return 0; }

binfeng-young avatar Nov 24 '21 01:11 binfeng-young

看起来有点神奇。。可能是哪里有低级bug 我最近比较忙,等我有空了看一下

mutouyun avatar Nov 27 '21 15:11 mutouyun

大佬解决这个bug了吗,我现在使用依旧遇到了这个bug

hxmmxh avatar Feb 02 '23 05:02 hxmmxh

好,我这周末看看

mutouyun avatar Feb 08 '23 05:02 mutouyun

我改了一下,你用这个分支(issue-71)上的代码测试下看看还有没有问题?

根本原因:

  • 无参全局变量初始化时,不会同时创建内部的 mutex 对象
  • main 函数内进行赋值操作,此时 mutex 对象才会被创建
  • 同时,mutex 对象实现上依赖一个 static 懒单例,此单例在 mutex 对象真正创建时才会初始化
  • 以上条件导致全局变量析构时,mutex 内的 static 懒单例在其之前就先析构了,从而导致内存访问异常

当前的解决方案:

  • 在 chan 对象初始化同时初始化 mutex 内的 static 懒单例,保证析构时的内存有效

mutouyun avatar Feb 11 '23 10:02 mutouyun

非常感谢大佬帮忙解决问题,我立马就去测试下,感恩!!

hxmmxh avatar Feb 11 '23 10:02 hxmmxh

没什么问题的话,我 merge 到 master 了哈

mutouyun avatar Feb 25 '23 07:02 mutouyun