WebRTC源代码探索之旅——多线程篇(8)

8 我们所学到Linux API

 

通过详尽地阅读WebRTC的线程模型代码,我们学到了以下这些Linux API是如何被实际应用的:

pthread_mutex_init、pthread_mutex_destroy、pthrea_mutex_lock、pthread_mutex_trylock、pthread_mutex_unlock

这5个函数可以完成对mutex的操作,基本上和Windows平台下地mutex差不多。

 

pthread_cond_init、pthread_cond_destroy、pthread_cond_broadcast、pthrea_cond_wait、pthread_cond_signal

这5个函数用来操作pthread的条件变量,它的功能有点类似于Windows平台的Event,但是颗粒度更加细。需要注意的是pthread_cond_wait函数在进入时会解锁mutex,并在返回之前加锁mutex,这是一个Windows程序员不太熟悉的行为。

 

socket、getsocketname、getpeername、bind、connect、recv、recvfrom、accept、closesocket、getsockopt、setsockopt、send、sendto

由于Windows平台也实现了BSD socket所以对于有网络编程经验的Windows开发人员应该可以很顺畅地使用Linux平台下的API。仅有一些参数的设置有些不同罢了(通常这些参数在Windows平台下设置为NULL)。

 

pipe、close、read、write、fcntl

这5个函数可以完成对管道的操作,其实在Windows平台下也有管道操作的API只是用得不多。简单一点来说,管道操作和socket操作差不多。

 

sigaction

signal相关的函数是Linux系统开发的一个难点。不过好在大多数状况下我们可以不依赖于signal机制开发应用软件。signal相关的有些函数在各个不同版本的Linux和Unix平台下会有不同的行为,所以在跨平台移植的时候会造成很多难以琢磨的bug。因此,我认为应该尽可能避免使用signal机制,如果必须使用请详细查阅目标平台的API说明。

 

select、FD_ZERO、FD_SET、FD_ISSET、FD_CLR

Linux下IO信号分离器,其实在Windows平台下也有,只是大多数情况下Windows程序员都会使用WSA版本的API。使用select函数其实也并不是很复杂,参考WebRTC的代码,可以很快地掌握它的用法。

 

pthread_key_create、pthread_getspecific、pthread_setspecific、pthread_key_delete

这4个函数实现了Linux平台下的TLS。它们的使用方法几乎等同于Windows下的TLS API,没有任何难度。

 

nanosleep、pthread_attr_init、pthread_create、pthread_join

以上5个线程操作函数也没有什么特别的地方,和Windows版本的API没有多大的区别。仅仅就是在Windows平台下使用WaitForSingleObject函数来替代pthread_join函数。

 

最后,让我们回溯一下本文,在Linux平台下WebRTC还有什么不能实现的Windows API功能?也许你在前面的章节注意到了,有一个很复杂的状况WebRTC没有解决方案:有多条线程同时调用WSAWaitForMultipleEvents函数,并且在所有的等待的句柄数组中都有同一个Event句柄。在这种情况下不论这个被等待的Event是auto reset或是manual reset,都没有很好的解决方案。不过,这种状况实在应该是极力避免的,如果你的程序中有这种状况出现,应该是非常难维护的。

你可能感兴趣的:(webrtc,c++,webrtc,多线程,源代码)