2013-08-01 45 views
1

可能有人,請給我解釋一下爲什麼我得到錯誤EXC_BAD_INSTRUCTION(代碼= EXC_I386_INVOP,子碼=爲0x0)在下面的代碼dispatch_semaphore_wait:爲什麼我得到錯誤EXC_BAD_INSTRUCTION(代碼= EXC_I386_INVOP,子碼=爲0x0)當我使用GCD

-(void) initialize { 
    dispatch_queue_t queue = dispatch_queue_create("My queue", NULL); 
    dispatch_semaphore_t sem = dispatch_semaphore_create(1); 
    self.queue = queue; 
    self.sem = sem; 
    self.myarray = [[NSMutableArray alloc]init]; 
    [self.myarray addObject: [[MyObject alloc] init]]; 
} 
-(MyObject *) method1 { 
    //do something 
    dispatch_semaphore_wait(self.sem, DISPATCH_TIME_FOREVER); 
    MyObject *obj = [self.myarray objectAtIndex:0]; 
    dispatch_barrier_sync(self.queue, ^{ 
    [self.myarray removeObjectAtIndex:0]; 
    }); 
    return obj; 
} 

-(void) method2:(MyObject *)object { 
    //do something 
    dispatch_barrier_async(self.queue, ^{ 
    [self.myarray addObject:object]; 
    dispatch_semaphore_signal(self.sem); 
    }); 
} 

我發現了類似的問題Why does this code cause "EXC_BAD_INSTRUCTION"?,但在我的情況下,我使用ARC和我沒有明確地寫無處dispatch_release(sem);

+0

「queue」是如何定義的?顯然,初始化中的一個不是同一個。 – ahwulf

+0

同樣,我忘了添加代碼,將局部變量賦值給實例變量 – zyxel

+0

所以......呃......你現在還有問題,你已經修復了代碼?因爲如果修復了你的代碼,那麼你應該接受答案,而不是編輯問題以使其毫無意義。 – ipmcc

回答

2

您在initialize方法中創建的sem在本地限定爲該方法。它需要通過其他方法訪問。如果你有一個名爲sem的iVar,你試圖分配,你通過在initialize中聲明一個局部變量來隱藏它。 (與queue同樣的事情,順便說一句。)

而且,你似乎在這裏有一個錯字,在您致電dispatch_semaphore_wait(sen, DISPATCH_TIME_FOREVER);(即SE ň VS本身

0

這種崩潰將在您運行CPU上不支持的(矢量)擴展時發生。

例如,在下面的Xcode 5「項目的設置/建造的設置/代碼生成,設置 ‘啓用其他矢量擴展’到‘AVX2’。建立你的可執行文件。

現在上運行:

  • 英特爾酷睿i5:它會崩潰(無論編譯器決定使用AVX2)與 'exc_i386_invop子碼=爲0x0'
  • 英特爾酷睿i7:。將工作
+0

這對我不起作用。當我嘗試在我的Table委託的tableView:viewForTableColumn:row:中調用tableColumn?.identifier時,我得到這個錯誤 – Arc676

+0

嘗試禁用向量擴展(avx2,sse等),看它是否會在某一時刻起作用。 – kalmiya

+0

對不起,那是前一陣子。我通過'NSTextField's存儲在一個數組中並訪問它們。感謝您的幫助,雖然:) – Arc676

1

如果沒有足夠的保護,您允許同時訪問陣列self.myarray。您可以在串行隊列self.queue上使用-addObject:-removeObjectAtIndex:修改陣列,但是您使用-objectAtIndex:從中讀取時沒有任何保護。這意味着你可能在寫信給它的同時閱讀它,這是不安全的。您還需要將-objectAtIndex:呼叫置於串行隊列中。

此外,您正在使用屏障函數與串行隊列,這沒有任何意義。

-(MyObject *) method1 { 
    //do something 
    dispatch_semaphore_wait(self.sem, DISPATCH_TIME_FOREVER); 
    __block MyObject *obj; 
    dispatch_sync(self.queue, ^{ 
    obj = [self.myarray objectAtIndex:0]; 
    [self.myarray removeObjectAtIndex:0]; 
    }); 
    return obj; 
} 

-(void) method2:(MyObject *)object { 
    //do something 
    dispatch_async(self.queue, ^{ 
    [self.myarray addObject:object]; 
    dispatch_semaphore_signal(self.sem); 
    }); 
} 
相關問題