멀티 스레딩에 대한 많은 경험이 없으며 두 개의 스레드에서 실행하는 데 적합한 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에 액세스하거나 쓰는 경우 세마포어를 사용해야합니까?
응답이 좋을까요?
감사합니다.
아, 두 개의 버퍼 솔루션은 간단하지만 천재입니다! 감사 –