背景:
这也是一个真实客户案例,但我不能透露代码及问题细节,只讲思想。
问题:
When performing the attached test case the xx.log becomes filled with these messages if using optimized executables:
pin : semaphore already held by holder=xxx
The messages do not happen with debug executables. One theory is a memory corruption situation.
客户说他们现场经常打印一句warning,我们对应源码查看了代码。伪代码如下:
void pin()
{
while (!flag){ sleep(1);}
if (hold > 0) {
printf("warning: holder already set\n");
exit(-1);
}
}
void unpin()
{
hold = -1; //没人持有
flag = 0; //无锁
}
pin 和unpin分数不同的进程,正如函数名所暗示分别用来上自旋锁和放自旋锁。这部

本文通过一个客户案例,揭示了一个由于编译器优化导致的指令重排问题,该问题在优化后的执行文件中导致警告信息频繁出现。在详细分析源码和汇编代码后,发现是`unpin`函数中`hold`和`flag`赋值顺序被错误地交换。为了解决这个问题,需要在关键代码段之间插入内存屏障,防止指令重排,以确保正确执行顺序。
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



