aliyun / alibabacloud-nls-cpp-sdk

The C++ SDK for Alibaba nature language and speech APIs.
Apache License 2.0
54 stars 30 forks source link

【Bug report】cpp sdk存在多线程共享变量使用不当造成的bug #10

Closed lewiszlw closed 1 year ago

lewiszlw commented 2 years ago

sdk version:3.0.10 os:centos(容器)

以下是分析过程:

image

代码预期执行过程

  1. 【主线程】创建并初始化SpeechRecognizerRequest并启动
  2. 【主线程】Recognizer启动时,会从线程池选择一个工作线程,并通知此线程,然后将连接状态置为NodeConnecting
  3. 【工作线程】接到通知事件后会开始dns解析和socket建立阶段,tcp连接设置成非阻塞模式,因此建立连接时直接返回115 Operation now in progress,然后立刻向下执行代码,等连接建立时会通过回调事件的方式通知
  4. 【工作线程】接收到socket连接建立事件并将连接置为NodeConnected
  5. 【工作线程】开始ssl握手(实际没有开启ssl因此没有握手)并将连接置为NodeShaking
  6. 【工作线程】ssl握手结束后,发送gateway request,并将连接置为NodeHandshaked
  7. 【工作线程】从websocket读取gateway response处理,并将连接置为NodeStarting,后续xxx

image P.S.第一个时间是开始准备初始化SpeechRecognizerRequest(设置url、appkey、采样率等),第二个时间是SpeechRecognizerRequest::start()执行结束

从日志看时间顺序

  1. 【主线程】创建并初始化SpeechRecognizerRequest并启动
  2. 【主线程】Recognizer启动时,会从线程池选择一个工作线程,并通知此线程(此时cpu时间给到工作线程)
  3. 【工作线程】工作线程进行dns解析和socket建立,建立后将连接置为NodeConnected
  4. 【工作线程】工作线程发送gateway request并等待response
  5. 【主线程】将连接置为NodeConnecting(覆盖了连接状态)
  6. 【工作线程】接收response后,发现连接为NodeConnecting,报错

问题出现条件分析

  1. 主线程在通知工作线程后,此时cpu时间正好分到工作线程
  2. dns解析和socket建立耗时极短
season4675 commented 1 year ago

感谢您提交的issue