osip2/eXosip2支持线程安全,既可以用于多线程的编程模式,也可以用于单线程的编程模式。osip2/eXosip2默认是使用多线程模式,也就是默认使能OSIP_MT宏。
当使用多线程模式时,用户需要编写线程处理函数,并在协议栈初始化成功后启动处理线程,示例代码如下:
UINT sipEventThread(void *pParams)
{
eXosip_event_t *je;
for (;;)
{
je = eXosip_event_wait (0, 50);
eXosip_lock();
eXosip_automatic_action ();
eXosip_unlock();
if (je == NULL)
continue;
switch (event->type)
{
case EXOSIP_REGISTRATION_NEW:
break;
case EXOSIP_REGISTRATION_SUCCESS:
break;
case EXOSIP_REGISTRATION_FAILURE:
break;
case EXOSIP_REGISTRATION_TERMINATED:
break;
……
default:
break;
}
eXosip_event_free(je);
}
}
对于单线程操作,并不是简单的禁能OSIP_MT宏即可,还需要增加一些额外的代码,示例代码如下:
for (;;)
{
eXosip_event_t *event;
if (!(event = eXosip_event_wait (0, 1)))
{
#ifndef OSIP_MT
eXosip_execute();
eXosip_automatic_action ();
#endif
osip_usleep (10000);
continue;
}
#ifndef OSIP_MT
eXosip_execute();
#endif
eXosip_automatic_action ();
switch (event->type)
{
case EXOSIP_REGISTRATION_NEW:
break;
case EXOSIP_REGISTRATION_SUCCESS:
break;
case EXOSIP_REGISTRATION_FAILURE:
break;
case EXOSIP_REGISTRATION_TERMINATED:
break;
……
default:
break;
}
eXosip_event_free (event);
}
eXosip_execute函数是整个协议栈的核心,对所有事务和事件的处理部分,都通过这个函数调用来执行。在多线程模式下,协议栈会开启一个单独的线程来调用该函数来处理事务。而在单线程模式下,则需要用户自己调用。