これを回避するために
static
void spinlock(gboolean* lock_flag)
{
    while(*lock_flag == TRUE) {
        g_usleep(0);
    }
}
とすれば、今度は make OPT=-O2でも whileが変な最適化されずに動くようです。

シングルスレッドの時には無害だった最適化が、マルチスレッドだと有害になることがあるので、厄介だと思いました。
while(flag){} が最適化で無効にされるのは厄介だと感じます