2012-11-26 4 views
-5

이 코드는 온라인에서 찾았지만 컴파일하고 싶지만 그 방법을 알 수는 없습니다. 나는 그것이 pthread 때문에 리눅스에서 행해져 야한다고 생각한다. 코드가 맞다고 가정하지만 100%이 될 수 없습니다. 누군가가 나를 도울 수 있다면 그것은 위대 할 것입니다.이 Linux 프로그램을 컴파일하려면 어떻게합니까?

헤더 당신은 POSIX -thread 라이브러리를 사용하여 명시 적으로 -pthread 옵션을 사용해야합니다

typedef enum { 
LEFT=0, 
RIGHT, 
STRAIGHT 
} turn_direction_t; 

typedef enum { 
NORTH=0, 
SOUTH, 
EAST, 
WEST 
} orientation_t; 

static void gostraight(orientation_t, unsigned int); 
static void turnleft(orientation_t, unsigned int); 
static void turnright(orientation_t, unsigned int); 
static void * approachintersection(void*); 
int createcars(int, char**); 


pthread_mutex_t NW_mutex = PTHREAD_MUTEX_INITIALIZER; 
pthread_mutex_t NE_mutex = PTHREAD_MUTEX_INITIALIZER; 
pthread_mutex_t SE_mutex = PTHREAD_MUTEX_INITIALIZER; 
pthread_mutex_t SW_mutex = PTHREAD_MUTEX_INITIALIZER; 


#define lock(CAR, MUTEX) do {   
if (pthread_mutex_lock(&MUTEX)) { 
    fprintf(stderr, "pthread_mutex_lock error %d\n", CAR);  
    exit(-1); 
} 
} while(0) 

#define unlock(CAR, MUTEX) do {  
if (pthread_mutex_unlock(&MUTEX)) { 
    fprintf(stderr, "pthread_mutex_unlock error %d\n", CAR); 
    exit(-1); 
} 
} while(0) 

바디

#include <stdlib.h> 
#include <stdio.h> 
#include <pthread.h> 
#include "intersection.h" 

#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) 

static void gostraight(orientation_t cardirection, unsigned int carnumber){ 

switch(cardirection){ 
case NORTH: 
lock_NE(carnumber); 
lock_SE(carnumber); 
printf("Car %d, Moving South-North\n", carnumber); 
unlock_SE(carnumber); 
unlock_NE(carnumber); 
break; 
case SOUTH: 
lock_NW(carnumber); 
lock_SW(carnumber); 
printf("Car %d, Moving North-South\n", carnumber); 
unlock_SW(carnumber); 
unlock_NW(carnumber); 
break; 
case EAST: 
lock_SE(carnumber); 
lock_SW(carnumber); 
printf("Car %d, Moving West-East\n", carnumber); 
unlock_SW(carnumber); 
unlock_SE(carnumber); 
break; 
case WEST: 
lock_NW(carnumber); 
lock_NE(carnumber); 
printf("Car %d, Moving East-West\n", carnumber); 
unlock_NE(carnumber); 
unlock_NW(carnumber); 
break; 
} 
} 

static void turnleft(orientation_t cardirection, unsigned int carnumber){ 

switch(cardirection){ 
case NORTH: 
lock_NE(carnumber); 
lock_SE(carnumber); 
lock_SW(carnumber); 
printf("Car %d, Moving South-West\n", carnumber); 
unlock_SW(carnumber); 
unlock_SE(carnumber); 
unlock_NE(carnumber); 
break; 
case SOUTH: 
lock_NW(carnumber); 
lock_NE(carnumber); 
lock_SW(carnumber); 
printf("Car %d, Moving North-East\n", carnumber); 
unlock_SW(carnumber); 
unlock_NE(carnumber); 
unlock_NW(carnumber); 
break; 
case EAST: 
lock_NW(carnumber); 
lock_SE(carnumber); 
lock_SW(carnumber); 
printf("Car %d, Moving West-North\n", carnumber); 
unlock_SW(carnumber); 
unlock_SE(carnumber); 
unlock_NW(carnumber); 
break; 
case WEST: 
lock_NW(carnumber); 
lock_NE(carnumber); 
lock_SE(carnumber); 
printf("Car %d, Moving East-South\n", carnumber); 
unlock_SE(carnumber); 
unlock_NE(carnumber); 
unlock_NW(carnumber); 
break; 
} 
} 

static void turnright(orientation_t cardirection, unsigned int carnumber){ 

switch(cardirection){ 
case NORTH: 
lock_NE(carnumber); 
printf("Car %d, Moving South-East\n", carnumber); 
unlock_NE(carnumber); 
break; 
case SOUTH: 
lock_SW(carnumber); 
printf("Car %d, Moving North-West\n", carnumber); 
unlock_SW(carnumber); 
break; 
case EAST: 
lock_SE(carnumber); 
printf("Car %d, Moving West-South\n", carnumber); 
unlock_SE(carnumber); 
break; 
case WEST: 
lock_NW(carnumber); 
printf("Car %d, Moving East-North\n", carnumber); 
unlock_NW(carnumber); 
break; 
} 
} 

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; 
} 

int main(int argc, char **argv){ 

int index, tid; 
unsigned int carids[NUMCARS]; 
pthread_t carthreads[NUMCARS]; 

for(index = 0; index <NUMCARS; index++){ 
carids[index] = index; 
tid = pthread_create(&carthreads[index], NULL, approachintersection, 

(void*)&carids[index]); 
} 

for(index = 0; index <NUMCARS; index++){ 
pthread_join(carthreads[index], NULL); 
} 
printf("Done\n"); 
return 1; 
} 
+1

다중 행 매크로에는 줄 연속 마커 (''\'')가 필요합니다. –

+4

그리고 무엇이 오류입니까? –

+1

당신은 C 컴파일러와 링커가 필요합니다 ... –

답변

3

.

다음은 프로그램을 컴파일하는 명령입니다.

gcc -Wall program.c -o program -pthread 
+0

명시 적 컴파일러 스위치가 필요한 "POSIX"라이브러리가 아닌 * threads * 라이브러리입니다. (스레드 라이브러리의 API는 POSIX에 의해 지정되는데, 이유는'-thread'가 아니라'-pthread'이기 때문입니다. POSIX가 특별히 컴파일러를 호출 할 필요가없는 많은 것들이 있습니다.) – zwol

+0

Zack : 정보에 대한 감사합니다. – Omkant

관련 문제