我刚刚在我的项目中使用Intel Parallel inspector,它会显示一条警告:
One or more threads in the application accessed the stack of another
thread. This may indicate one or more bugs in your application.
我确实有一些在线程之间共享的堆栈上分配的对象.我不明白为什么这是一个问题.任何提示?
解决方法
想象一下 – 一个线程正在执行,并且调用一个具有本地(堆栈)变量(对象)的方法.它将此对象添加到工作队列,该队列由单独的线程处理.
该线程获取第一个线程添加的项,并访问第一个线程的堆栈上的对象.
在此期间第一个线程做了什么?它可能已退出该方法并释放该堆栈空间.释放的空间可能会也可能不会被重复使用.访问第一个线程的堆栈的第二个线程可能会或可能不会正常工作,具体取决于时间和调用图.
如果您知道堆栈变量将存在而第二个线程处理它,那么它可以是安全的;例如,如果线程1对堆栈变量进行排队,然后阻塞,直到线程2通知它已完成处理,这是一个安全的操作.
发出警告而不是错误,因为这可能是也可能不是合法操作,并且分析器无法确定.