2016-03-15 51 views
1

下面的代碼產生以下警告: ‘factoryThread’ may be used uninitialized in this function [-Wmaybe-uninitialized] 「「X`可在此功能未初始化」警告和並行線程,C

pthread_t factoryThreads[NUM_FACTORIES]; 
    int factoryNums[NUM_FACTORIES]; 
    for (int i = 0; i < NUM_FACTORIES; i++) { 
     factoryNums[i] = i + 1; 
     pthread_t factoryThread; 
     factoryThreads[i] = factoryThread; 
     pthread_create(&factoryThreads[i], NULL, createAndInsertCandy, 
       &factoryNums[i]); 
    } 

代碼似乎按預期方式工作,但我仍然好奇,導致警告的原因以及我能做些什麼來解決這個問題。

+1

pthread_t factoryThread; factoryThreads [i] = factoryThread; –

回答

2

您可以通過使用具有自動存儲時間,這是不確定的未初始化的變量的值調用未定義行爲,它只是發生工作。

刪除無意義的變量和賦值。

pthread_t factoryThreads[NUM_FACTORIES]; 
int factoryNums[NUM_FACTORIES]; 
for (int i = 0; i < NUM_FACTORIES; i++) { 
    factoryNums[i] = i + 1; 
    pthread_create(&factoryThreads[i], NULL, createAndInsertCandy, 
      &factoryNums[i]); 
} 
+0

什麼是「自動存儲時間」?你是否意味着當它創建的函數返回時它超出了範圍?該代碼位於我的'main()'函數中,所以線程在程序結束之前不會超出範圍。還有一個問題(工廠線程在'main()'之前完成)? – Adam

+1

不,'factoryThread'是塊中的一個局部變量,它在退出'for'循環後會消失。這種情況下的問題不是它們消失,而是未初始化的非靜態局部變量具有不確定的變量,並且您使用了它,這是不好的。 – MikeCAT

+0

然後修改後的代碼中的'factoryThread'對象可能是在'pthread_create()'中初​​始化的? – Adam

相關問題