• UNIX网络编程——客户/服务器程序设计示范(四)


        TCP预先派生子进程服务器程序,accept使用线程上锁保护

         

            我们使用线程上锁保护accept,因为这种方法不仅适用于同一进程内各线程之间的上锁,而且适用于不同进程之间的上锁。
            为了使用线程上锁,我们的main、child_make和child_main函数都保持不变,唯一需要改动的是那3个上锁函数。在不同进程之间使用线程上锁要求:

    • 互斥锁变量必须存放在由所有进程共享的内存区中;
    • 必须告知线程函数库这是在不同进程之间共享的互斥锁。

         (注:这要求线程库支持PTHREAD_RPOCESS_SHARED属性。)

    #include	"unpthread.h"
    #include	<sys/mman.h>
    
    static pthread_mutex_t	*mptr;	/* actual mutex will be in shared memory */
    
    void
    my_lock_init(char *pathname)
    {
    	int		fd;
    	pthread_mutexattr_t	mattr;
    
    	fd = Open("/dev/zero", O_RDWR, 0);
    
    	mptr = Mmap(0, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE,
    				MAP_SHARED, fd, 0);
    	Close(fd);
    
    	Pthread_mutexattr_init(&mattr);
    	Pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
    	Pthread_mutex_init(mptr, &mattr);
    }
    
    void
    my_lock_wait()
    {
    	Pthread_mutex_lock(mptr);
    }
    
    void
    my_lock_release()
    {
    	Pthread_mutex_unlock(mptr);
    }
    

    12-16      打开/dev/zero然后调用mmap。所映射的字节数是一个pthread_mutex_t类型变量的大小。随着关闭描述符;这么做事可行的,因为该描述符已被内存映射了。

    18-20      我们使用PTHREAD_PROCESS_SHARED初始化全局或静态互斥锁变量。然而对于一个存放在共享内存区中的互斥锁,我们调用一些Pthread库函数以告知该函数库:这是一个位于共享内存区中的互斥锁,将用于不同进程之间的上锁。我们首先为一个互斥锁以默认属性初始化一个pthread_mutexattr_t结构,然后赋予该结构PTHREAD_PROCESS_SHARED属性(该属性的默认值为PTHREAD_PROCESS_PRIVATE,即只允许在单个进程内使用)。最后调用pthread_mutex_init函数以这些属性初始化共享内存区中的互斥锁。


  • 相关阅读:
    Spring和Mybatis整合
    Spring的基本操作
    mybatis在xml文件中处理特殊符号(如:大于号小于号等的方法)
    配置MyBatis 环境
    iframe元素內嵌页面如何去掉继承的html及body背景色/背景图片
    如何解决include包含页面的乱码问题
    Servlet重定向后,页面混乱的解决办法
    使用Ajax验证邮箱是否存在
    使用监听器监听用户访问页面的次数
    基于arduino的红外传感系统
  • 原文地址:https://www.cnblogs.com/wangfengju/p/6172537.html
Copyright © 2020-2023  润新知