jeremyczhen / fdbus

FDBus - Fast Distributed Bus
https://blog.csdn.net/jeremy_cz/article/details/89060291
161 stars 85 forks source link

deadlock occur when BaseContext register in QNX OS #31

Open uniuz opened 3 years ago

uniuz commented 3 years ago

Hi, Jeremy,

发现一个初始化阶段的死锁现象,该问题发生在 BaseContext注册时,详细调用栈: (CFdbBaseContext::tearup) ---> (FDB_CONTEXT->registerContext) ---> (sendSyncEndeavor) ---> sendSync。 发生该问题的根本原因是在QNX系统上线程创建pthread_create并不能保证线程执行体迟于pthread_create的返回;一旦线程执行体早于pthread_create的返回,BaseThread成员mThread并未赋值时sendSyncEndeavor中的isSelf返回false,最终导致Context线程内执行了sendSync,死锁发生。 使用sendAsyncEndeavor完成registerContext可以避免这个问题,但fdbus中仍有其他类似风险存在,因此需要一种线程执行体与pthread_create之间的同步机制;

Thanks