2012-09-02 4 views
0

C에서 FIFO를 구현하고 있습니다. 하나의 스레드가 FIFO에 쓰고 있고 다른 스레드가 읽고 있습니다.다중 스레드 응용 프로그램에서 다른 함수의 실행을 일시 중단합니다.

#define BUFFER_LENGTH 1000 
struct Frame 
{ 
    char data[1024]; 
    unsigned int data_len; 
    struct Frame* frame; 
}; 

struct Frame * get_from_fifo() 
{ 
    if (!fifo_length) 
    { 
     first = last = NULL; 
     return NULL; 
    } 
    struct Frame* frame = first; 
    first = first->frame; 
    fifo_length--; 
    return frame; 
} 


int add_to_fifo (const char* data, unsigned int frame_size) 
{ 
    if (fifo_length >= BUFFER_LENGTH) 
    { 
     ast_log(LOG_ERROR, "Buffer full\n"); 
     return SURESH_ERROR; 
    } 

    struct Frame* frame = malloc(sizeof (struct Frame)); 
    frame->data_len = frame_size; 
    memcpy(frame->data, data, frame_size); 

    if (last) 
    { 
     last->frame = frame; 
     last = frame; 
    } 

    if (!first) 
    { 
     first = last = frame; 
    } 
    fifo_length++; 
    return SURESH_SUCCESS; 
} 

는 어떻게 * add_to_fifo * 기능을 방지 할 수 있고 * get_from_fifo * 다른 스레드에 의해 동시에 호출 할 수 있습니다. 즉 * get_from_fifo *는 다른 스레드가 * add_to_fifo * 및 vice verca를 실행하지 않을 때만 호출해야합니다.

답변

1

FIFO 스택을 구현할 때 만 실제로 동시 작업을하면 스택 크기 (fifo_length)가 변경됩니다.
스택의 끝 부분에 항목을 추가하고 스택 헤드에서 항목을 제거하면이 두 작업이 서로 간섭하지 않습니다. 따라서 스택 크기 (fifo_length)를 변경하는 것만으로도 걱정할 필요가있는 부분은 뮤텍스 또는 플래그 (위의 "Joey"에서 설명한대로)와 동기화 된 별도의 함수에 넣고 add_to_fifo()get_from_fifo() 함수에서 호출하는 것입니다.

0

뮤텍스 (상호 배제) 변수를 사용해야합니다. pthread 라이브러리에는 필요한 모든 것이 있습니다. 여기에 사용 가능한 기능을보고 시작하는 좋은 장소는 다음과 같습니다

http://pubs.opengroup.org/onlinepubs/009695399/basedefs/pthread.h.html

당신은 각 스레드에 액세스 할 수있을 것이라는 점을 뮤텍스 변수를 초기화하기 위해서 필요합니다 : 그런 다음 스레드가 필요합니다 http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_init.html

을 그들이 공유 메모리에 대한 액세스를 필요로 할 때 그것을 잠금, 그들이 공유 메모리 사용하여 수행하는 경우 다음 잠금을 해제 : 이 http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_mutex_lock.html

다음은 간단한 예제 : 를

행운을 빌어 요!