2011-09-30 30 views
1

對不起,如果問題標題混淆。我只是想把所有的東西放在一起。 我有一段代碼,如:將全局數組鎖定在多線程程序中的重入期望函數中?

int newThread(int(*pfunc)()) 
{ 
    pthread_t tid; 
    pthread_create(&tid, NULL, pfunc, NULL); 
    int i = 0; 
    while(threads[i] != 0 && i < MAX_NUM_THREADS) 
    { 
     if ((MAX_NUM_THREADS - 1) == i) 
     { 
     puts("We've run out of threads' number limit\n"); 
     return 1; 
     } 
     ++i; 
    } 
    threads[i] = tid; 
    pthread_join(tid, NULL); 
    return 0; 
} 

threads []是一個全局數組。我想讓這個函數是可重入的,但這意味着我不應該使用全局變量,據我所知。我想這是因爲全局變量的值在某個特定時間是不可預測的。但在我看來,陣列似乎是相當可預測的。

  1. 沒問題,如果我使用互斥鎖鎖定數組以使此功能可重入?
  2. 如果是,那我該怎麼做對不對?在使用它之前鎖定第一個元素,然後解鎖?或者在訪問時鎖定/解鎖每個元素會更好嗎?
  3. 這甚至有可能使此功能重入?

回答

2

如果說一個功能是折返,它應該只依靠局部變量由兩個(或多個線程)同時被稱爲並返回正確的結果。

如果函數依賴於一些共享的數據,(我們不能真正使其折返),我們可以把它線程安全要由兩個(或更多)的線程同時呼籲,如果所有訪問共享數據被序列化。

爲了讓您的函數成爲線程安全的,您應該將循環和插入鎖定爲threads[]。如果僅鎖定循環部分,則有人可以在循環結束和等級i處的修飾之間修改threads的內容。

pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER; 

int newThread(int(*pfunc)()) 
{ 
    pthread_t tid; 
    pthread_create(&tid, NULL, pfunc, NULL); 
    int i = 0; 
    pthread_mutex_lock(&mymutex);   // take the lock 
    while(threads[i] != 0 && i < MAX_NUM_THREADS) 
    { 
     if ((MAX_NUM_THREADS - 1) == i) 
     { 
     puts("We've run out of threads' number limit\n"); 
     pthread_mutex_unlock(&mymutex); // don't forget to release the lock here too :) 
     return 1; 
     } 
     ++i; 
    } 
    threads[i] = tid; 
    pthread_mutex_unlock(&mymutex);  // release the lock 
    pthread_join(tid, NULL); 
    return 0; 
} 
+0

@Julien感謝您的編輯和回答。這是我的想法,但我不確定,因爲我找不到任何信息。我忘了在返回+1時釋放鎖定! 我需要一天的時間來獲得更多評論,如果有的話 – rightaway717

+1

請記住,您必須在其他地方執行相同的鎖定,並且還有代碼觸及'threads'。 – nos

相關問題