0

멀티 쓰레드 프로그래밍에 익숙하다. 누구든지 나를 도와 줄 수 있는지 궁금하다.멀티 쓰레드 프로그램을 사용하여 시리얼 메시지를 수신하고 구성하기 (C++)

직렬 (연속) 비동기 메시지를 수신 한 프로그램을 만들어이 메시지를 읽고 구성해야합니다.

멀티 스레드 기술을 사용하려고합니다 : 첫 번째 스레드는 시리얼 정보를 받아 행렬 (RxTh [col] [row])에 한 줄에 줄을 써야합니다. 그런 다음 두 번째 스레드가 호출되어 RxTh 행렬의 각 행을 읽고 특정 문자 ('begin line'msg를 상징 함)를 검색합니다. 또한이 스레드는이 수신 메시지를 다른 행렬 (Msg [col2] [row2])에 넣어야합니다.이 행은 msg의 각 행을 새 행렬의 다른 행으로 구분합니다.

앞으로이 재배치 된 선을 사용하여 구체적인 정보를 검색해야하지만이 부분에서는 지금 생각하지 않습니다.

그래서,이 프로그램에 몇 가지 문제가 있습니다 :

  • 첫째, 내가 읽기 부분을 시작 작성 중지 때 직렬 메시지의 일부 조각을 잃고있다. 그래서 뮤텍스 또는 중요한 섹션을 사용하려고했습니다. 그러나 그것은 작동하지 않으며, 나는 왜 그런지 모른다.

  • 두 번째 문제는 두 번째 행렬 (Msg [] [])이 일부 줄의 중간에 '0'의 이상한 시퀀스를 가지고 있으며이 스레드가 시작될 때이 '0'이 나타나는 것으로 의심됩니다. RxTh 행렬의 새로운 행을 읽는다. 어떤 의미가 있습니까?

  • 뮤텍스를 사용할 때 한 번에 한 행만 잠글 수 있습니까?

누군가가 나를 도울 수 있다면, 나는 많이 감사 할 것입니다 !!

자세한 정보가 필요하거나 코드 조각이 필요한 경우 나에게 물어보십시오.

감사합니다.

답변

0

정말로 원하는 것은 버퍼 대기열입니다. 매트릭스는 복제 만하고 있지만 혼란스럽고 메타 데이터 (데이터에 관한 데이터)를 가지고 있지 않습니다.

1) 버퍼를 포함하는 클래스 나 구조체를 정의하고이 버퍼에있는 정보 (얼마나 많은 데이터가 쓰여 졌는지 등)를 정의하십시오. Like :

class Buff 
{ 
    char contents[1024]; //(this represents your row) 
    int numWritten; 
    ... 
} 

2) 임계 구역에 의해 보호되는 FIFO 대기열을 생성합니다.

이제 스레드 1은 new 버퍼를 생성하고 채우며 임계 구역을 획득하고 큐의 끝에있는 버퍼를 푸시하고 중요한 섹션을 해제합니다.

스레드 2는 임계 구역을 획득하고, 대기열에서 첫 번째 버퍼를 가져와 임계 구역을 해제합니다. 버퍼 처리가 끝나면 삭제합니다.

추가 동기화가 필요하므로 처리 할 전체 버퍼가 더 이상 없을 때까지 기다릴 수 있습니다. 또한 thread1은 채워진 버퍼의 수가 너무 많으면 thread2가 더 많은 시간을 갖도록 일시 중지해야합니다.

버퍼를 만들고 삭제하는 것이 최적이 아니라고 생각되면 버퍼 관리자를 만드십시오. 사전 정의 된 수의 버퍼 (열 수)를 보유합니다. Thread1은 new 대신 해당 풀에서 버퍼를 가져오고 thread2는 delete 대신 풀에 버퍼를 반환합니다.

모든 버퍼에 대해 별도의 뮤텍스를 만들면 한 번에 하나의 버퍼를 쉽게 잠글 수 있습니다. 그러나 하나의 스레드 만 보내고받는 스레드에서는 필요하지 않습니다.

+0

답변을 주셔서 감사합니다. 그러나 저는 아직 몇 가지 질문이 있습니다 ... 중요한 섹션에 의해 보호되는 FIFO 큐를 만드는 방법을 모르겠습니다. 아이디어를 얻을 수 있도록 몇 가지 예제 코드를 보여줄 수 있습니까? 감사합니다. – NatCruella

+0

@NatCruella 그것은 단지 목록 일뿐입니다. 순서를 지키는 어떤 명부든지 할 것이다. FIFO는 새로운 항목을 마지막에 넣고 처음부터 가져 오는 것을 의미합니다 (또는 잘못된 경우 선택 사항입니다). –

+0

"중요한 부분에 의해 지키기"는 또한 프로그래머가 사용하는 방법 일뿐입니다. 이는 단순히 스레드가 임계 영역 (또는 뮤텍스 또는 세마포어 또는 원하는 모든 스레드 동기화)을 획득하여 대기열에 액세스해야 함을 의미합니다. 큐에 액세스하는 모든 코드에서 중요한 시그니처가 이전에 획득되고 릴리스 된 것임을 간단하게 확인할 수 있습니다. 또는 큐와 critsection을 전용 멤버로 캡슐화하는 개체를 만듭니다. 유일하게 노출 된 public 메서드는 Add() 및 Remove()이며, 이러한 메서드에서 중점을 가져오고 목록에 액세스하고 critsection을 릴리스합니다. –