2016-03-28 15 views
-1

2つのスレッドは2つのrunTimes関数を呼び出す必要があり、runTimes関数はincrease_countdecrease_countを呼び出す必要があります。最終的に結果は3になるはずです。問題は、プログラムを実行するときにコードの最後の行が実行されず、競合状態の原因を特定できないということです。レースコンディションCスレッド

#define MAX_RESOURCES 5 


int available_resources = MAX_RESOURCES; 
int times = 100000; 
pthread_mutex_t mutex; 
sem_t semaphore; 

/* decrease available_resources by count resources 
* return 0 if sufficient resources available, 
* otherwise return -1 */ 
int decrease_count(int count) { 
if (available_resources < count) { 
    return -1; 
} else { 
    available_resources -= count; 
    printf("Locked %i resources, now available: %i\n" , count , available_resources); 
    return 0; 
} 
} 


/* increase available resources by count */ 
int increase_count(int count) { 
if (count + available_resources > 5) { 
    return -1; 
} else { 
    available_resources += count; 
    printf("Freed %i resources, now available: %i\n" , count , available_resources); 
    return 0; 
} 
} 


void *runTimes(void *null) { 
int i = 0 , result; 
while (i < times) { 
    result = -1; 
    while (result < 0) {result = decrease_count(1);} 
    result = -1; 
    while (result < 0) {result = increase_count(1);} 
    i += 1; 
    printf("Count; %i\n",i); 
} 

return NULL; 
} 

int main(int argc, char *argv[]) 
{ 
pthread_t thread1 , thread0; 
pthread_t threads [2]; 

decrease_count(2); 

pthread_create(&thread0, NULL, runTimes, NULL); 
pthread_create(&thread1, NULL, runTimes, NULL); 

int i = 0; 
while(i < 2) { 
    pthread_join(threads[i], NULL); 
    i++; 
} 

pthread_exit(NULL); 


printf("Currently available resources (should be 3): %i\n" , available_resources); 

return 0; 
} 
+1

する

pthread_create(&thread0, NULL, runTimes, NULL); pthread_create(&thread1, NULL, runTimes, NULL); 

を変更、そうするには

正しくコードをインデントしてください。 –

+0

が修正されました。申し訳ありません – Mattia

+0

「*修正*」?私はまだ一種の混乱を見る。 – alk

答えて

0

コードの最後の行が

を実行されません。これは、あなたがこの

printf("Currently available resources (should be 3): %i\n" , available_resources); 

(最後)を呼び出す前に

pthread_exit(NULL); 

を呼び出すbeacuseですライン。

pthread_exit()現在のスレッドを終了し、その関数を呼び出したスレッドです。


あなたが表示するコードのレースは、これとは関係ありません。これは、コードが同じ変数に同時にアクセスすることに対する保護を実装していないために発生する可能性があります。


作成したスレッドにも参加します。

pthread_create(&threads[0], NULL, runTimes, NULL); 
pthread_create(&threads[1], NULL, runTimes, NULL); 
+0

とにかく実行されなかった後に置くと、どうすればいいですか? – Mattia

+1

「pthread_exit(NULL);」を削除します。コメントする、削除する、それを破壊する、それを排除する、exerminateする –