多线程多进程同步技术的选择


1.多对一,包含了一个资源队列:
 
多个线程一个资源(一个资源队列), 可以用互斥量(或临界区或只有一个资源的信号量)+事件对象(条件变量)来实现对该资源(资源队列)的同步高效访问;同一个进程下windows下用临界区效率比较高,其它内核对象要1000都CPU周期调度时间;linux下没有必要用在进程间的就限定在同一个进程中也可以有效提高性能。

使用情景:异步读取线程,异步网络接收数据线程,界面线程(宜采用消息发送同步)等情况下常采用这样的模型( 临界区性能好,互斥量非阻塞能够处理更多事情,或互斥量+事件对象模型)。

2.多对多,包含了一个线程对多个资源:
多个线程多个资源(多个资源队列), 可以分配一个信号量。信号量的个数指定了资源的个数。
 多对多里面也包含了一线程对多资源 ,可以给每个资源绑定一个互斥量(或临界区或 只有一个资源的信号量);如果不需要事件对象,那么就设置互斥量为非阻塞的,一个线程可以遍历多个互斥量,看那个可以操作。
使用多个互斥量,其实和使用一个信号量是一样的,但是使用一个资源绑定一个互斥量(信号量)更好的控制当前那个资源是空闲的,而信号量就没那么容易了。OpenSemaphore(), OpenMutex()一般在多进程间,多线程间用不到,因为可以共享全局变量。
    信号量还有一个特点,就是同一个线程中可以释放其它的信号量(互斥量必须释放自己), 所以可以实现交叉控制。
    在创建一个资源的信号量时,信号量除了互斥,还有一个同步的作用,就是其它的线程会被阻塞当释放时候又可以唤醒之前等待的线程,这样不需要和事件对象配合也可以做到同步。
   使用情景:多块共享内存,多个线程或进程可以访问;多线程进程竞争多台打印机;多线程进程竞争多个通信串口。要求每个线程都可以操作多个资源中的任何一个(读或者写); ( 这种情况也可以用多个互斥量每个绑定一个资源 + 事件对象(条件变量)实现, 而且是非阻塞线程时候只能使用多个互斥量,否则用信号量会导致资源不够而阻塞。window下的共享内存一般使用互斥量非阻塞(或互斥量阻塞+事件对象)模型。linux下的共享内存一般用信号量来实现。)

更多改进的方法和深入的参考文章mark:
http://blog.csdn.net/sszgg2006/article/details/8573348
http://www.gpbeta.com/post/develop/windows-fast-semaphore/
http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/ousCriticalSections.mspx?mfr=true
http://www.cppblog.com/zjl-1026-2001/archive/2010/03/03/108768.html
http://blog.csdn.net/lanmanck/article/details/6100019
http://blog.csdn.net/ce123_zhouwei/article/details/11778399


你可能感兴趣的:(多线程多进程同步技术的选择)