Как NSLog решает проблему оптимизации? - PullRequest
3 голосов
/ 09 декабря 2011

Мое приложение создает вторичный поток по NSOperationQueue. В основном потоке он пишет сообщение в буфер, который является глобальной переменной. Во вторичном потоке он ожидает прибытия сообщения с символом новой строки. Хорошо работает без опции оптимизации. Он остается в цикле while, если я компилирую с любым параметром оптимизации (-O1 ~ -Os). Но если я пишу NSLog внутри цикла, это работает. В чем проблема этого? Есть ли лучший способ решить эту проблему без использования NSLog?

while (!strchr(buffer, '\n')) {
    NSLog(@"!");   // without this, in optimized mode, it stays in while loop.
}

1 Ответ

5 голосов
/ 09 декабря 2011

Ваш buffer, вероятно, не объявлен volatile.Компилятор может предположить, что никто не изменяет buffer, и превратить цикл в:

char* res = strchr(buffer, '\n');
while (!res) {}

, что может быть бесконечным циклом.

При использовании NSLog компилятор не может предполагать, что NSLog выигралне связывайтесь с глобальными переменными, поэтому условие не учитывается.


Если вы хотите дождаться готовности другого потока, используйте хотя бы переменную условия ( NSCondition ) вместо бесконечного цикла.Или, может быть, перестроить базу кода для использования GCD .

...