C++中回调函数的多线程

C++中回调函数的多线程,c++,callback,pthreads,linuxthreads,C++,Callback,Pthreads,Linuxthreads,我使用Jabber/XMPP和gloox框架实现了一个聊天应用程序,它应该在Ubuntu Linux中同时发送和接收消息 我当前的代码实现是: int main() { ... int temp = pthread_create(&iSend, NULL, SendMessage, &b); int temp1 = pthread_create(&iRecv, NULL, ConnServer, &b); } void* ConnServer

我使用Jabber/XMPP和gloox框架实现了一个聊天应用程序,它应该在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时被挂起。调用在iRecv线程中运行的recv函数后,将调用recv回调函数handleMessage。但是,控件永远不会移回iSend线程,该线程应该调用SendMessage函数


请帮助

我看不出SendMessage是如何发送多条hello消息的


当然这里有各种各样的内存问题,例如,如果连接失败,j根本不会被删除,因为它的作用域是函数,所以根本不需要使用new创建它。

您不能指望首先调度iSend线程。这完全取决于操作系统。

快速问题-您可以同时执行连接呼叫和发送消息-您可以这样做,还是应该连续呼叫他们?此外,cin挂起,因为它正在等待来自stdin的角色。你能输入一些东西吗?除了所有其他技术问题,例如内存泄漏,你还可以调用j->recv500000。如果内存可用,它将阻塞,直到收到缓冲区大小500000中请求的字节数为止。因为我怀疑你用这个简单的程序发送那么多的数据,我建议把它作为一个小得多的缓冲区来启动,并且只有在你认为有必要的时候才增加它。发送和接收不是同时发生的。我也评论了cin,但它并没有改变人们的行为。SendMessage函数根本没有被调度..j->recv需要一个时间参数来确定睡眠时间,它不是一个标准套接字接收调用,而是对gloox框架的调用。一些谷歌搜索让我想到了这一点。然而,我不能完全理解实现,即GetJobFromMainThreadhi,这是我的疑问。我需要使用cin获取用户输入,iSend线程应该与处理回调函数的iRecv线程并行调度。