Я правильно использую mutex_trylock? - PullRequest
0 голосов
/ 30 октября 2018

Гонщики должны иметь равные шансы на победу. Когда я запускаю программу, результаты кажутся правильными, оба гонщика выигрывают примерно в половине случаев, но я не думаю, что правильно использую 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);

}

1 Ответ

0 голосов
/ 30 октября 2018

, когда первый поток блокирует B0 и если второй запланирован для блокировки B1, это приведет к взаимоблокировке. Если первый мьютекс заблокирован, а второй не заблокирован, отпустите первый мьютекс и повторите цикл. Этот цикл может быть меньше, если попытаться использовать mutex_lock, а не trylock.

...