Гонщики должны иметь равные шансы на победу. Когда я запускаю программу, результаты кажутся правильными, оба гонщика выигрывают примерно в половине случаев, но я не думаю, что правильно использую mutex_trylock. Это действительно что-то делает с тем, как я это реализовал? Я новичок в C, поэтому я не знаю много об этом.
Описание программы:
Предположим, два гонщика, в двух по диагонали противоположный угол прямоугольной области. Они должны пройти по дорогам вдоль периферии региона. Есть два моста на двух противоположных сторонах прямоугольника. Для того, чтобы завершить один раунд обхода, гонщики должны получить пропуск на оба моста за раз. Условия гонки:
1) Одновременно только один гонщик может получить пропуск.
2) Прежде чем начать один раунд, он должен запросить и получить оба прохода, а затем, после окончания этого раунда, должен освободить проходы и сделать новую попытку получить эти проходы для следующего раунда.
3) Racer1 (R1) сначала получит мостовый проход B1, затем B0. R0 получит B0, а затем B1.
4) Предусмотрено максимальное количество раундов. Тот, кто достигнет этого числа первым, будет победителем, и гонка остановится.
Так выглядит ситуация до старта.
B0
R0-------- ~ -------------
| |
| |
| |
| |
--------- ~ ------------- R1
B1
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#define THREAD_NUM 2
#define MAX_ROUNDS 200000
#define TRUE 1
#define FALSE 0
/* mutex locks for each bridge */
pthread_mutex_t B0, B1;
/* racer ID */
int r[THREAD_NUM]={0,1};
/* number of rounds completed by each racer */
int numRounds[THREAD_NUM]={0,0};
void *racer(void *); /* prototype of racer routine */
int main()
{
pthread_t tid[THREAD_NUM];
void *status;
int i,j;
/* create 2 threads representing 2 racers */
for (i = 0; i < THREAD_NUM; i++)
{
/*Your code here */
pthread_create(&tid[i], NULL, racer, &r[i]);
}
/* wait for the join of 2 threads */
for (i = 0; i < THREAD_NUM; i++)
{
/*Your code here */
pthread_join(tid[i], &status);
}
printf("\n");
for(i=0; i<THREAD_NUM; i++)
printf("Racer %d finished %d rounds!!\n", i, numRounds[i]);
if(numRounds[0]>=numRounds[1]) printf("\n RACER-0 WINS.\n\n");
else printf("\n RACER-1 WINS..\n\n");
return (0);
}
void *racer(void *arg)
{
int index = *(int*)arg, NotYet;
while( (numRounds[0] < MAX_ROUNDS) && (numRounds[1] < MAX_ROUNDS) )
{
NotYet = TRUE;
/* RACER 0 tries to get both locks before she makes a round */
if(index==0){
/*Your code here */
pthread_mutex_trylock(&B0);
pthread_mutex_trylock(&B1);
}
/* RACER 1 tries to get both locks before she makes a round */
if(index==1){
/*Your code here */
pthread_mutex_trylock(&B1);
pthread_mutex_trylock(&B0);
}
numRounds[index]++; /* Make one more round */
/* unlock both locks */
pthread_mutex_unlock(&B0);
pthread_mutex_unlock(&B1);
/* random yield to another thread */
}
printf("racer %d made %d rounds !\n", index, numRounds[index]);
pthread_exit(0);
}