2011-12-09 15 views
3

私のアプリケーションは、NSOperationQueueによってセカンダリスレッドを作成します。 メインスレッドでは、グローバル変数であるバッファにメッセージを書き込みます。 セカンダリスレッドでは、改行文字を含むメッセージが到着するまで待機します。 最適化オプションなしでうまく動作します。 最適化オプション(-O1〜-Os)でコンパイルすると、whileループのままです。 ループ内にNSLogを書くと、動作します。 これの問題は何ですか? NSLogを使用せずにこの問題を解決できる良い方法はありますか?NSLogは最適化のバグをどのように解決しますか?

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

Xcode> 3.2.6でビルドしていますか。もしそうなら、ARMV6ベースのデバイス(iPhone 2G、3G)でテストしていますか? – Till

答えて

5

お客様のbufferはおそらくnot declared volatileです。コンパイラは、他の誰もbufferを変更しないと仮定して、にループを回すことができます無限ループ可能性があり

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

NSLogを使用すると、コンパイラはNSLogでグローバルが混乱しないと想定できないので、条件は除外されません。あなたは準備ができて、別のスレッドを待つしたい場合は


することは、少なくとも代わりに無限ループの条件変数(NSCondition)を使用してください。またはGCDを使用するようにコードベースを再設計することもできます。

+0

私は志を書きませんでした。コードをvolatile charバッファに変更しました[64]。コンパイラが警告します 'volatile char []'を 'const char *'型のパラメータに渡すと修飾子が破棄されます。どうすれば変更できますか? – user1071621

+0

volatileは機能しません。代わりに、私はpthread_mutex_lock(&mutex)によってループ中に囲みました。できます。私はNSConditionについて知らない。 NSConditionはpthreadよりも優れていますか? NSCoditionを使用する場合、ループを使用する必要はありませんか? – user1071621

+0

もう一度コンパイルしても、再び動作しません。 Pthreadは解決策ではありませんでした。最初は、揮発性が問題を解決できると思いました。私はなぜそれが動作しないのか分からない。 – user1071621

関連する問題