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


  • 相关阅读:
    2020/2/14
    2020/2/13
    《人类简史》
    2020/2/12
    bzoj3157国王奇遇记(秦九韶算法+矩乘)&&bzoj233AC达成
    [noip科普]关于LIS和一类可以用树状数组优化的DP
    [uva11722&&cogs1488]和朋友会面Joining with Friend
    Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)
    NOIP2016滚粗记
    bzoj2228[ZJOI2011]礼物(gift)
  • 原文地址:https://www.cnblogs.com/wangfengju/p/6172537.html
Copyright © 2011-2022 走看看