赛车手应有同等的获胜机会。当我运行程序时,结果似乎是正确的,两个赛车手都赢了大约一半的时间,但是我认为我没有正确使用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);
}
答案 0 :(得分:0)
当第一个线程锁定B0时,如果第二个线程计划锁定B1,则它将导致死锁。如果第一个互斥锁已锁定而第二个互斥锁未锁定,则释放第一个互斥锁并再次循环。如果尝试使用Mutex_lock而不是trylock,则此循环会更小。