• 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函数以这些属性初始化共享内存区中的互斥锁。


  • 相关阅读:
    前后端渲染
    ES6模块化
    关于跨域请求
    移动端经常出现的兼容问题
    移动端开发
    4.sass的分支结构、循环结构、函数
    3.sass的数据类型与函数
    2.sass变量、嵌套、混合(mixin)、继承拓展、@import、comment
    1.sass的安装,编译,还有风格
    微信小程序上拉加载分页数据---包括tab选项卡切换(优化方案)
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332549.html
Copyright © 2020-2023  润新知