2011-03-16 3 views
6

멀티 스레딩에 대한 많은 경험이 없으며 두 개의 스레드에서 실행하는 데 적합한 C 프로그램을 작성하고 있습니다. 이 프로그램은 직렬 포트에서 데이터를 수신하고 사용 가능한 새로운 데이터를 읽고 처리하며 요청이있을 때 제 3자인 IPC api (혼란스럽게 IPC로 명명 됨)을 통해 다른 (관련없는) 모듈에 최신 처리 데이터를 게시합니다.멀티 스레드 C 프로그램 설계 도움말

IPC를 통해 데이터를 게시하라는 요청을 받으려면 IPC_listenwait (wait_time);을 호출해야합니다. 그런 다음 "listenwaiting"동안 게시 요청이 수신되면 처리기가 호출되어 최신 데이터를 게시합니다.

하나의 옵션은 같은 하나 개의 스레드에서이 작업을 수행하는 것입니다

for(;;) { 
    read_serial(inputBuffer); 
    process_data(inputBuffer, processedData); //Process and store 
    IPC_listenwait(wait_time); //If a request to publish is received during this, 
}       //then a handler will be invoked and the newest piece of   
          //processedData will be published to other modules 

publishRequestHandler() { //Invoked when a message is received during IPC_listenwait 
    IPC_publish(newest(processedData)); 
} 

그리고 이것은 작동하지만 응용 프로그램이 프로그램이 새로운 데이터를 게시 요청에 매우 반응하는 것이 중요하고, 그 게시 된 데이터가 최신 상태입니다. 이러한 목표는 프로세스가 수신 대기를 시작한 후 및 게시 요청을 받기 전에 데이터가 도착할 수 있기 때문에 위의 사항에 만족하지 않습니다. 또는 메시지 발행 요청이 들어 왔을 때 프로세스가 읽기/처리 중일 수 있지만 다음 IPC_listenwait 호출까지는 서비스를 제공 할 수 없습니다. 단지 수신 메시지를 듣고

readThread() { 
    for(;;) { //pseudocode 
     select(); 
     read(inputBuffer); 
     process(inputBuffer, processedData); 
    } 
} 

그리고 메인 스레드를 가지고 :

mainThread() { 
    IPC_listenwait(forever); 
} 

publishRequestHandler() { //Invoked when a message is received during IPC_listenwait 
    IPC_publish(newest(processedData)); 
} 
내가 생각할 수있는

유일한 디자인은 단지 같은 것을 할 것입니다 읽을 수있는 하나 개의 스레드를 가지고있다

이 디자인을 사용 하시겠습니까? 그렇다면, processedData에 액세스하거나 쓰는 경우 세마포어를 사용해야합니까?

응답이 좋을까요?

감사합니다.

답변

4

대부분 옳은 길을 가고 있습니다.

주의해야 할 것은 게시자가 다른 사람이 읽으려고하는 동안 하나의 스레드가 다른 사람을 방해하지 않으므로 게시 가능한 데이터에 동시 액세스하는 것입니다. 이를 막으려면 현재 버퍼로 간주되는 버퍼와 뮤텍스로 보호 된 포인터를 사용하십시오. process_data()에 준비가되면 무 전류 버퍼에 결과를 덤프하고 포인터 뮤텍스를 잠그고 새 데이터가 들어있는 버퍼에 포인터를 다시 배치 한 다음 뮤텍스를 릴리스해야합니다. 비슷하게 게시자는 포인터 뮤텍스를 현재 데이터를 읽는 동안 잠 가야합니다. 그러면 포인터가 그것을 기다리는 것을 강요합니다. 이는 뮤텍스 보호가 설정된 단일 버퍼를 갖는 것보다 조금 복잡하지만 새로운 데이터를 준비하는 동안 항상 게시 할 수있는 무언가가 있음을 보장합니다.

처리 단계가 오래 걸리므로 여러 데이터 집합을 읽을 수있는 경우 읽기/프로세스 스레드를 두 개로 나누고 독자가 프로세서가 최신 및 최대 프로세서 만 가져올 수 있도록하십시오. 당신이 게시하지 않을 것들을 처리하지 않게됩니다.

우수한 첫 번째 질문입니다. upvote을하십시오.

+0

아, 두 개의 버퍼 솔루션은 간단하지만 천재입니다! 감사 –