В этом коде много неправильного.
В ветке вашего продюсера вы делаете следующее:
stThreadInfoProd->pEventQueue->AddTail(pMsg1);
и если AddTail не является умным, это добавляет указатель на очередь, он не дублирует строку. Затем в вашем потребителе вы делаете это:
char *pMsg = (char*)stThreadInfoCons->pEventQueue->RemoveHead();
, который получает указатель, который вы добавили в очередь. Это указывает на буфер, который вы используете для сообщений производителя, поэтому, когда вы делаете это в получателе:
strcpy(pMsg,stThreadInfoCons->pThreadName);
strcat(pMsg,"Thread No:");
strcat(pMsg,"Removed Msg");
вы перезаписываете буфер производителя. Я думаю, что вы хотели, больше похоже на это:
char *pProducerMsg = (char*)stThreadInfoCons->pEventQueue->RemoveHead();
и тогда следующие строки не будут перезаписывать данные производителя.
Но это создает другую проблему. В вашем продюсере вы делаете это:
stThreadInfoProd->pEventQueue->AddTail(pMsg1);
, который добавляет указатель в очередь, а затем немедленно делает это:
memset(pMsg1,0,100);
strcpy(pMsg1,stThreadInfoProd->pThreadName);
strcat(pMsg1,"Thread No:");
strcat(pMsg1,"Added Msg");
, который перезаписывает буфер. Эта перезапись почти наверняка произойдет до того, как у потребителя будет возможность использовать сообщение, поэтому потребитель будет читать измененный буфер, а не сообщение, которое вы первоначально отправили. Чтобы решить эту проблему, измените производителя следующим образом:
stThreadInfoProd->pEventQueue->AddTail(strdup(pMsg1));
Strdup создает копию содержимого буфера, на который указывает pMsg1.
Потребитель тогда должен быть:
char *pProducerMsg = (char*)stThreadInfoCons->pEventQueue->RemoveHead();
// do something with pProducerMsg
free (pProducerMsg); // strdup calls malloc, so a matching free is required