Open uniuz opened 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
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