Многопоточность для функции обратного вызова в C++

Я внедряю приложение чата с использованием Jabber/XMPP и gloox framework, которое должно отправлять и получать сообщения одновременно в Ubuntu Linux.

Моя текущая реализация кода:

int main()
{
        ...
 int temp = pthread_create(&iSend, NULL, SendMessage, &b);
 int temp1 = pthread_create(&iRecv, NULL, ConnServer, &b);
}

void* ConnServer(void *athis)
{
 UserClient *t = (UserClient*)athis;
 t->ConnecttosServer();
}

bool UserClient::ConnecttosServer()
{
 //JID jid( "map@jo-hely.hu/gloox" );

 j = new Client( iUserJid, iUser.getPassword() );
 j->registerMessageHandler( this);
 j->registerConnectionListener( this );
 j->registerMessageSessionHandler(this);
 bool result = j->connect(false);
 if(result == true)
 {
  iConnected = true;
  ConnectionError er = ConnNoError;
  ConnectionError er1 = ConnNoError;
  while(er == ConnNoError || er1 == ConnNoError)
  {
   er = j->recv(500000);
   sleep(2);
  }
  delete j;
 }
...
}

void* SendMessage(void * athis )// JID *aDest)
{
 UserClient *t = (UserClient*)athis;
 //JID *t = (JID)dest;

 string ip ;
 cout << "enter here";
 cin >> ip;
 if(t->iConnected == true)
 {
  if(t->iMessageSession == NULL )
  {
   string aBody = "hello";

   MessageSession *session = new MessageSession(t->j, t->iDestJid);
   session->registerMessageHandler(t);
   session->send(aBody.c_str());
  } 
 }
}

Проблема состоит в том, что оба потока созданы, и pthread_join() вызывается для обоих.

Поток iSend запланирован первым, но приостановлен в cin. Когда вызывается функция recv(), которая выполняется в потоке iRecv, вызывается функция handleMessage() обратного вызова recv. Однако элемент управления никогда не возвращается обратно в поток iSend, который должен вызывать функцию SendMessage().

Пожалуйста помоги

2 ответа

Я не вижу там, как SendMessage отправляет более одного "привет" сообщения.

Конечно, здесь возникают различные проблемы с памятью, например, j не удалится вообще, если соединение не удалось, и, поскольку его область действия только для функций, нет никакой реальной необходимости создавать его с новым.

Вы не можете рассчитывать на то, что поток iSend запланирован первым. Это полностью зависит от операционной системы.

Другие вопросы по тегам