スレッドとミューテックス ロックを使用して交差点をシミュレートしようとしています。
直進、左折、右折の機能があります。今、私は交差点に近づくための機能を持っています。これにより、ランダムな方向と回転が生成されます。各スレッドは、接近する交差点を共有します。
全方向のすべての車にすべてのロックを定義しました。
進行海峡関数をとります。その時点でどの車が何をしているかを出力するだけの switch ステートメントがあります。今、私はこの関数で何をロックすべきかわかりません。車が北を向いている場合、東と西をロックし、南を向いている車が北を向いているのと同じようにロックしますか?
これは、ロックまたはロック解除する関数を呼び出すだけの私のロックです
#define NUMCARS 30
#define lock_NW(CAR) lock(CAR, NW_mutex)
#define lock_NE(CAR) lock(CAR, NE_mutex)
#define lock_SW(CAR) lock(CAR, SW_mutex)
#define lock_SE(CAR) lock(CAR, SE_mutex)
#define unlock_NW(CAR) unlock(CAR, NW_mutex)
#define unlock_NE(CAR) unlock(CAR, NE_mutex)
#define unlock_SW(CAR) unlock(CAR, SW_mutex)
#define unlock_SE(CAR) unlock(CAR, SE_mutex)
ここがメイン
int main(int argc, char **argv){
/* Initial variables*/
int index, tid;
unsigned int carids[NUMCARS];
pthread_t carthreads[NUMCARS];
/* Start up a thread for each car*/
for(index = 0; index <NUMCARS; index++){
carids[index] = index;
tid = pthread_create(&carthreads[index], NULL, approachintersection, (void*)&carids[index]);
}
/* Wait for every car thread to finish */
for(index = 0; index <NUMCARS; index++){
pthread_join(carthreads[index], NULL);
}
printf("Done\n");
return 1;
}
ここは直進関数を呼び出す接近交差点です
static void * approachintersection(void* arg){
unsigned int * carnumberptr;
unsigned int carnumber;
orientation_t cardir = (orientation_t)random()%4;
unsigned long turn = random()%3;
carnumberptr = (unsigned int*) arg;
carnumber = (unsigned int) *carnumberptr;
if(turn==LEFT){
turnleft(cardir, carnumber);
} else if(turn==RIGHT){
turnright(cardir, carnumber);
} else {//straight
gostraight(cardir, carnumber);
}
return (void*)carnumberptr;
}
さて、これが適切な方向をロックしたい海峡機能です。
/*
cardirection - The direction the car is pointing. If it is pointing NORTH,
it is starting from the South-Eastern corner of the intersection
and "going straight" means it wants to move SOUTH to NORTH.
valid options: NORTH, SOUTH, EAST, WEST
carnumber - The car identifier
*/
static void gostraight(orientation_t cardirection, unsigned int carnumber){
switch(cardirection){
case NORTH:
printf("Car %d, Moving South-North\n", carnumber);
break;
case SOUTH:
printf("Car %d, Moving North-South\n", carnumber);
break;
case EAST:
printf("Car %d, Moving West-East\n", carnumber);
break;
case WEST:
printf("Car %d, Moving East-West\n", carnumber);
break;
}
}
したがって、接近する車が南から北を指している場合、その車は SE 車であり、ケースを東にロックし、西は lock_SE(CAR) で関数を出力しますか? 他のスレッドが入って印刷するのを防ぎますか? だから私は印刷ステートメントをロック解除しますか?
または、switch ステートメント全体をロックしますか?
**編集:これはそれを行う方法ですか?**
static void turnleft(orientation_t cardirection, unsigned int carnumber){
int CAR;
CAR = carnumber;
switch(cardirection){
case NORTH:
lock_SE(CAR)
printf("Car %d, Moving South-West\n", carnumber);
unlock_SE(CAR)
break;
case SOUTH:
lock_NW(CAR)
printf("Car %d, Moving North-East\n", carnumber);
unlock_NW(CAR)
break;
case EAST:
lock_SW(CAR)
printf("Car %d, Moving West-North\n", carnumber);
unlock_SW(CAR)
break;
case WEST:
lock_NE(CAR)
printf("Car %d, Moving East-South\n", carnumber);
unlock_NE(CAR)
break;
}
}